*BSD News Article 15171


Return to BSD News archive

Xref: sserve comp.bugs.4bsd:1945 comp.os.386bsd.bugs:569
Newsgroups: comp.bugs.4bsd,comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!doc.ic.ac.uk!uknet!mcsun!sun4nl!eur.nl!pk
From: pk@cs.few.eur.nl (Paul Kranenburg)
Subject: Re: flock broken - I could use some help
Message-ID: <1993Apr26.170501.12617@cs.few.eur.nl>
Sender: news@cs.few.eur.nl
Reply-To: pk@cs.few.eur.nl
Organization: Erasmus University Rotterdam
References: <C5t8wH.Hs@moxie.hou.tx.us> <1993Apr21.184636.1121@cs.few.eur.nl>
Date: Mon, 26 Apr 1993 17:05:01 GMT
Lines: 37

In <1993Apr21.184636.1121@cs.few.eur.nl> I said:
>The problem is a dangling pointer left in the lockf structure belonging to
>the current lock holder. The offending process frees its lock structure
>after breaking out of sleep() as a result of a signal. Possible fix:
>scan the list of waiting locks to remove the lock that isn't going to be
>used.

Unfortunately, the fix that went with it was totally bogus. This one might
do a better job:

------- ufs_lockf.c -------
*** /tmp/da24999	Mon Apr 26 18:57:25 1993
--- ufs/ufs_lockf.c	Mon Apr 26 18:55:57 1993
***************
*** 155,160 ****
--- 155,175 ----
  		}
  #endif /* LOCKF_DEBUG */
  		if (error = tsleep((caddr_t)lock, priority, lockstr, 0)) {
+ 
+ 			/* Don't leave a dangling pointer in block list */
+ 			if (lf_getblock(lock) == block) {
+ 				struct lockf	**prev;
+ 
+ 				/* Still there, find us on list */
+ 				prev = &block->lf_block;
+ 				while ((block = block->lf_block) != NOLOCKF) {
+ 					if (block == lock) {	
+ 						*prev = block->lf_block;
+ 						break;
+ 					}
+ 					prev = &block->lf_block;
+ 				}
+ 			}
  			free(lock, M_LOCKF);
  			return (error);
  		}