diff options
author | kib <kib@FreeBSD.org> | 2007-02-15 09:53:49 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2007-02-15 09:53:49 +0000 |
commit | b4f5200c2e9b1a32ff99c7e97f1e8f0142bdbdcd (patch) | |
tree | 4fb0d3b0fc435f154fb008821935b27ff992bb14 | |
parent | 80c0e5fb98112d27a5c17274c4838e580ff81b36 (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/kern/vfs_lookup.c | 7 |
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; |