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;