Module Name:    src
Committed By:   riz
Date:           Wed Nov 14 20:07:45 UTC 2012

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

Log Message:
Pull up following revision(s) (requested by dholland in ticket #1466):
        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.72.2.3 -r1.72.2.4 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.28.2.2 -r1.28.2.3 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.72.2.3 src/sys/kern/vfs_lookup.c:1.72.2.4
--- src/sys/kern/vfs_lookup.c:1.72.2.3	Sat Feb 17 23:27:47 2007
+++ src/sys/kern/vfs_lookup.c	Wed Nov 14 20:07:44 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.72.2.3 2007/02/17 23:27:47 tron Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.72.2.4 2012/11/14 20:07:44 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.72.2.3 2007/02/17 23:27:47 tron Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.72.2.4 2012/11/14 20:07:44 riz Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_systrace.h"
@@ -941,6 +941,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.28.2.2 src/sys/miscfs/genfs/layer_vnops.c:1.28.2.3
--- src/sys/miscfs/genfs/layer_vnops.c:1.28.2.2	Mon Apr 16 20:01:13 2007
+++ src/sys/miscfs/genfs/layer_vnops.c	Wed Nov 14 20:07:44 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_vnops.c,v 1.28.2.2 2007/04/16 20:01:13 bouyer Exp $	*/
+/*	$NetBSD: layer_vnops.c,v 1.28.2.3 2012/11/14 20:07:44 riz Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -67,8 +67,8 @@
  *
  * Ancestors:
  *	@(#)lofs_vnops.c	1.2 (Berkeley) 6/18/92
- *	$Id: layer_vnops.c,v 1.28.2.2 2007/04/16 20:01:13 bouyer Exp $
- *	$Id: layer_vnops.c,v 1.28.2.2 2007/04/16 20:01:13 bouyer Exp $
+ *	$Id: layer_vnops.c,v 1.28.2.3 2012/11/14 20:07:44 riz Exp $
+ *	$Id: layer_vnops.c,v 1.28.2.3 2012/11/14 20:07:44 riz Exp $
  *	...and...
  *	@(#)null_vnodeops.c 1.20 92/07/07 UCLA Ficus project
  */
@@ -233,7 +233,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.28.2.2 2007/04/16 20:01:13 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.28.2.3 2012/11/14 20:07:44 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -436,8 +436,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