Module Name: src Committed By: njoly Date: Wed Oct 28 18:24:44 UTC 2009
Modified Files: src/lib/libc/sys: flock.2 src/sys/kern: sys_descrip.c Log Message: Make flock(2) more robust to invalid operation, such as (LOCK_EX|LOCK_SH). To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/lib/libc/sys/flock.2 cvs rdiff -u -r1.16 -r1.17 src/sys/kern/sys_descrip.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/sys/flock.2 diff -u src/lib/libc/sys/flock.2:1.19 src/lib/libc/sys/flock.2:1.20 --- src/lib/libc/sys/flock.2:1.19 Thu May 13 10:20:58 2004 +++ src/lib/libc/sys/flock.2 Wed Oct 28 18:24:44 2009 @@ -1,4 +1,4 @@ -.\" $NetBSD: flock.2,v 1.19 2004/05/13 10:20:58 wiz Exp $ +.\" $NetBSD: flock.2,v 1.20 2009/10/28 18:24:44 njoly Exp $ .\" .\" Copyright (c) 1983, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)flock.2 8.2 (Berkeley) 12/11/93 .\" -.Dd December 11, 1993 +.Dd October 26, 2009 .Dt FLOCK 2 .Os .Sh NAME @@ -136,7 +136,7 @@ .It Bq Er EINVAL The argument .Fa operation -does not include one of +does not include exactly one of .Dv LOCK_EX , .Dv LOCK_SH or Index: src/sys/kern/sys_descrip.c diff -u src/sys/kern/sys_descrip.c:1.16 src/sys/kern/sys_descrip.c:1.17 --- src/sys/kern/sys_descrip.c:1.16 Wed Jun 10 23:48:10 2009 +++ src/sys/kern/sys_descrip.c Wed Oct 28 18:24:44 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_descrip.c,v 1.16 2009/06/10 23:48:10 yamt Exp $ */ +/* $NetBSD: sys_descrip.c,v 1.17 2009/10/28 18:24:44 njoly Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.16 2009/06/10 23:48:10 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.17 2009/10/28 18:24:44 njoly Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -585,21 +585,25 @@ lf.l_whence = SEEK_SET; lf.l_start = 0; lf.l_len = 0; - if (how & LOCK_UN) { + + switch (how & ~LOCK_NB) { + case LOCK_UN: lf.l_type = F_UNLCK; atomic_and_uint(&fp->f_flag, ~FHASLOCK); error = VOP_ADVLOCK(vp, fp, F_UNLCK, &lf, F_FLOCK); fd_putfile(fd); return error; - } - if (how & LOCK_EX) { + case LOCK_EX: lf.l_type = F_WRLCK; - } else if (how & LOCK_SH) { + break; + case LOCK_SH: lf.l_type = F_RDLCK; - } else { + break; + default: fd_putfile(fd); return EINVAL; } + atomic_or_uint(&fp->f_flag, FHASLOCK); p = curproc; if (how & LOCK_NB) {