Module Name:    src
Committed By:   riz
Date:           Tue Nov  6 20:02:47 UTC 2012

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

Log Message:
Pull up following revision(s) (requested by dholland in ticket #1814):
        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.110.4.1 -r1.110.4.2 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.35 -r1.35.20.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.110.4.1 src/sys/kern/vfs_lookup.c:1.110.4.2
--- src/sys/kern/vfs_lookup.c:1.110.4.1	Mon Nov 17 19:01:15 2008
+++ src/sys/kern/vfs_lookup.c	Tue Nov  6 20:02:46 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.110.4.1 2008/11/17 19:01:15 snj Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.110.4.2 2012/11/06 20:02:46 riz Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.110.4.1 2008/11/17 19:01:15 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.110.4.2 2012/11/06 20:02:46 riz Exp $");
 
 #include "opt_magiclinks.h"
 
@@ -965,6 +965,7 @@ relookup(struct vnode *dvp, struct vnode
 	/*
 	 * We now have a segment name to search for, and a directory to search.
 	 */
+	*vpp = NULL;
 	if ((error = VOP_LOOKUP(dvp, vpp, cnp)) != 0) {
 #ifdef DIAGNOSTIC
 		if (*vpp != NULL)

Index: src/sys/miscfs/genfs/layer_vnops.c
diff -u src/sys/miscfs/genfs/layer_vnops.c:1.35 src/sys/miscfs/genfs/layer_vnops.c:1.35.20.1
--- src/sys/miscfs/genfs/layer_vnops.c:1.35	Wed Jan 30 09:50:23 2008
+++ src/sys/miscfs/genfs/layer_vnops.c	Tue Nov  6 20:02:47 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_vnops.c,v 1.35 2008/01/30 09:50:23 ad Exp $	*/
+/*	$NetBSD: layer_vnops.c,v 1.35.20.1 2012/11/06 20:02:47 riz Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -232,7 +232,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.35 2008/01/30 09:50:23 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.35.20.1 2012/11/06 20:02:47 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -437,8 +437,10 @@ layer_lookup(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