Module Name:    src
Committed By:   msaitoh
Date:           Sun Nov 18 18:36:59 UTC 2012

Modified Files:
        src/sys/kern [netbsd-6]: vfs_lookup.c
        src/sys/miscfs/genfs [netbsd-6]: layer_vnops.c

Log Message:
Pull up following revision(s) (requested by dholland in ticket #664):
        sys/kern/vfs_lookup.c: revision 1.195
        sys/miscfs/genfs/layer_vnops.c: revision 1.51
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.192 -r1.192.8.1 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.50 -r1.50.8.1 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.192 src/sys/kern/vfs_lookup.c:1.192.8.1
--- src/sys/kern/vfs_lookup.c:1.192	Tue Sep 27 02:10:55 2011
+++ src/sys/kern/vfs_lookup.c	Sun Nov 18 18:36:58 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.192 2011/09/27 02:10:55 christos Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.192.8.1 2012/11/18 18:36:58 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.192 2011/09/27 02:10:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.192.8.1 2012/11/18 18:36:58 msaitoh Exp $");
 
 #include "opt_magiclinks.h"
 
@@ -1687,6 +1687,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.50.8.1
--- src/sys/miscfs/genfs/layer_vnops.c:1.50	Mon Jul 11 08:34:01 2011
+++ src/sys/miscfs/genfs/layer_vnops.c	Sun Nov 18 18:36:58 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.50.8.1 2012/11/18 18:36:58 msaitoh 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.50.8.1 2012/11/18 18:36:58 msaitoh 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