summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_lookup.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2007-02-15 09:53:49 +0000
committerkib <kib@FreeBSD.org>2007-02-15 09:53:49 +0000
commitb4f5200c2e9b1a32ff99c7e97f1e8f0142bdbdcd (patch)
tree4fb0d3b0fc435f154fb008821935b27ff992bb14 /sys/kern/vfs_lookup.c
parent80c0e5fb98112d27a5c17274c4838e580ff81b36 (diff)
downloadFreeBSD-src-b4f5200c2e9b1a32ff99c7e97f1e8f0142bdbdcd.zip
FreeBSD-src-b4f5200c2e9b1a32ff99c7e97f1e8f0142bdbdcd.tar.gz
If both ISDOTDOT and NOCROSSMOUNT are set then lookup() might breaks out
of the special handling for ".." and perform an ISDOTDOT VOP_LOOKUP() for a filesystem root vnode. Handle this case inside lookup(). Submitted by: tegge PR: 92785 MFC after: 1 week
Diffstat (limited to 'sys/kern/vfs_lookup.c')
-rw-r--r--sys/kern/vfs_lookup.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
index bf624d8..464cc05 100644
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -520,15 +520,16 @@ dirloop:
for (;;) {
if (dp == ndp->ni_rootdir ||
dp == ndp->ni_topdir ||
- dp == rootvnode) {
+ dp == rootvnode ||
+ ((dp->v_vflag & VV_ROOT) != 0 &&
+ (cnp->cn_flags & NOCROSSMOUNT) != 0)) {
ndp->ni_dvp = dp;
ndp->ni_vp = dp;
vfslocked = VFS_LOCK_GIANT(dp->v_mount);
VREF(dp);
goto nextname;
}
- if ((dp->v_vflag & VV_ROOT) == 0 ||
- (cnp->cn_flags & NOCROSSMOUNT))
+ if ((dp->v_vflag & VV_ROOT) == 0)
break;
if (dp->v_iflag & VI_DOOMED) { /* forced unmount */
error = EBADF;
OpenPOWER on IntegriCloud