Module Name: src
Committed By: riz
Date: Wed Nov 14 20:15:37 UTC 2012
Modified Files:
src/sys/kern [netbsd-4-0]: vfs_lookup.c
src/sys/miscfs/genfs [netbsd-4-0]: 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.3.6.1 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.28.2.2 -r1.28.2.2.6.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.72.2.3 src/sys/kern/vfs_lookup.c:1.72.2.3.6.1
--- 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:15:36 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.3.6.1 2012/11/14 20:15:36 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.3.6.1 2012/11/14 20:15:36 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.2.6.1
--- 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:15:37 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.2.6.1 2012/11/14 20:15:37 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.2.6.1 2012/11/14 20:15:37 riz Exp $
+ * $Id: layer_vnops.c,v 1.28.2.2.6.1 2012/11/14 20:15:37 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.2.6.1 2012/11/14 20:15:37 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;