[net.bugs.4bsd] kernal bug in flock

fred@nmtvax.UUCP (04/11/84)

> Subject: flock panics kernel when given invalid parameter
>
> Index:	sys/sys/kern_descrip.c 4.2BSD
>
> Description:
> 	The flock system call can cause the 4.2 kernel to panic when
> 	given an invalid second parameter.  This occurs only when the
> 	file in question is already locked with LOCK_SH and a second
> 	call to flock where the second parameter does not contain any
> 	of (LOCK_UN|LOCK_EX|LOCK_SH) set.
>
> Repeat-By:
> 	The problem can be shown with:
> 		...
> 	flock(fd, LOCK_SH);
> 		...
> 	flock(fd, 0);
> 		...
>
> Fix:
> 	The following context diff of kern_descrip.c prevents the panics:
> 
> *** kern_descrip.c	Mon Apr  9 08:16:14 1984
> --- /sys/sys/kern_descrip.c	Wed Mar 28 14:35:47 1984
> ***************
> *** 405,414
>   		u.u_error = EOPNOTSUPP;
>   		return;
>   	}
> - 	if ((uap->how & (LOCK_UN|LOCK_EX|LOCK_SH){
> - 		u.u_error = EINVAL;			/* ??? */
> - 		return;
> - 	}
>   	if (uap->how & LOCK_UN) {
>   		ino_unlock(fp, FSHLOCK|FEXLOCK);
>   		return;
> --- 405,410 -----
>   		u.u_error = EOPNOTSUPP;
>   		return;
>   	}
>   	if (uap->how & LOCK_UN) {
>   		ino_unlock(fp, FSHLOCK|FEXLOCK);
>   		return;

I found that the above fix was obviously not tested by the person who
posted it. The fix had both a syntax error and a logic error.
The fix should have been:

- 	if (!(uap->how & (LOCK_UN|LOCK_EX|LOCK_SH))){
- 		u.u_error = EINVAL;			/* ??? */
- 		return;
- 	}


            Fred Romelfanger
            Computer Science Department
            New Mexico Tech

            ..!ucbvax!unmvax!nmtvax!fred    (uucp)
            ..!cmcl2!lanl-a!nmtvax!fred     (uucp)
            fred.nmt@rand-relay             (arpa)
            fred@nmt                        (CSnet)