Module Name:    src
Committed By:   njoly
Date:           Mon Jan 31 18:48:50 UTC 2011

Modified Files:
        src/sys/fs/sysvbfs: sysvbfs_vnops.c

Log Message:
In sysvbfs_lookup(), deny last component write operation on a
read-only mount.
Fix PR/44302: sysvbfs allows unlink on fs mounted MNT_RDONLY.

Reviewed by pooka.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/fs/sysvbfs/sysvbfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/sysvbfs/sysvbfs_vnops.c
diff -u src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.35 src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.36
--- src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.35	Tue Nov 30 10:43:04 2010
+++ src/sys/fs/sysvbfs/sysvbfs_vnops.c	Mon Jan 31 18:48:50 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs_vnops.c,v 1.35 2010/11/30 10:43:04 dholland Exp $	*/
+/*	$NetBSD: sysvbfs_vnops.c,v 1.36 2011/01/31 18:48:50 njoly Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.35 2010/11/30 10:43:04 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.36 2011/01/31 18:48:50 njoly Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -85,10 +85,16 @@
 	*a->a_vpp = NULL;
 
 	KASSERT((cnp->cn_flags & ISDOTDOT) == 0);
+
 	if ((error = VOP_ACCESS(a->a_dvp, VEXEC, cnp->cn_cred)) != 0) {
 		return error;	/* directory permission. */
 	}
 
+	/* Deny last component write operation on a read-only mount */
+	if ((cnp->cn_flags & ISLASTCN) && (v->v_mount->mnt_flag & MNT_RDONLY) &&
+	    (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
+		return EROFS;
+
 	if (namelen == 1 && name[0] == '.') {	/* "." */
 		vref(v);
 		*a->a_vpp = v;

Reply via email to