Module Name:    src
Committed By:   dholland
Date:           Wed Oct 10 06:55:26 UTC 2012

Modified Files:
        src/sys/kern: vfs_lookup.c
        src/sys/miscfs/genfs: layer_vnops.c

Log Message:
In layer_lookup(), clear *vpp before returning EROFS, as otherwise a
stale value can be returned and this causes a diagnostic panic in
namei.

In relookup(), clear *vpp before calling VOP_LOOKUP, as is done in
lookup_once(), as an additional precautionary measure.

(in theory both of these fixes are not required together)

Should fix PR 47040.


To generate a diff of this commit:
cvs rdiff -u -r1.194 -r1.195 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.50 -r1.51 src/sys/miscfs/genfs/layer_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/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.194 src/sys/kern/vfs_lookup.c:1.195
--- src/sys/kern/vfs_lookup.c:1.194	Mon Oct  8 23:43:33 2012
+++ src/sys/kern/vfs_lookup.c	Wed Oct 10 06:55:25 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.194 2012/10/08 23:43:33 dholland Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.195 2012/10/10 06:55:25 dholland Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.194 2012/10/08 23:43:33 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.195 2012/10/10 06:55:25 dholland Exp $");
 
 #include "opt_magiclinks.h"
 
@@ -1708,6 +1708,7 @@ relookup(struct vnode *dvp, struct vnode
 	/*
 	 * We now have a segment name to search for, and a directory to search.
 	 */
+	*vpp = NULL;
 	cnp->cn_flags |= INRELOOKUP;
 	error = VOP_LOOKUP(dvp, vpp, cnp);
 	cnp->cn_flags &= ~INRELOOKUP;

Index: src/sys/miscfs/genfs/layer_vnops.c
diff -u src/sys/miscfs/genfs/layer_vnops.c:1.50 src/sys/miscfs/genfs/layer_vnops.c:1.51
--- src/sys/miscfs/genfs/layer_vnops.c:1.50	Mon Jul 11 08:34:01 2011
+++ src/sys/miscfs/genfs/layer_vnops.c	Wed Oct 10 06:55:25 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_vnops.c,v 1.50 2011/07/11 08:34:01 hannken Exp $	*/
+/*	$NetBSD: layer_vnops.c,v 1.51 2012/10/10 06:55:25 dholland Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -170,7 +170,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.50 2011/07/11 08:34:01 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.51 2012/10/10 06:55:25 dholland Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -353,8 +353,10 @@ layer_lookup(void *v)
 	dvp = ap->a_dvp;
 
 	if ((flags & ISLASTCN) && (dvp->v_mount->mnt_flag & MNT_RDONLY) &&
-	    (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
+	    (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) {
+		*ap->a_vpp = NULL;
 		return EROFS;
+	}
 
 	ldvp = LAYERVPTOLOWERVP(dvp);
 	ap->a_dvp = ldvp;

Reply via email to