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;