diff options
| author | Colin Percival <cperciva@FreeBSD.org> | 2010-01-25 23:48:47 +0000 |
|---|---|---|
| committer | Colin Percival <cperciva@FreeBSD.org> | 2010-01-25 23:48:47 +0000 |
| commit | 04368fba20168cca086a263d64d6b399a41a13a2 (patch) | |
| tree | a3b71bfccbf028d9ed62f596c68240b662573f15 /sys/kern | |
| parent | 570f2897153d11c5df3945e7030eec92ec4fad4c (diff) | |
Notes
Diffstat (limited to 'sys/kern')
| -rw-r--r-- | sys/kern/vfs_lookup.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index 43ba766e5fdb..d28d9cb3ca9c 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -191,10 +191,26 @@ namei(struct nameidata *ndp) ndp->ni_rootdir = fdp->fd_rdir; ndp->ni_topdir = fdp->fd_jdir; - dp = fdp->fd_cdir; + if (ndp->ni_startdir != NULL) { + dp = ndp->ni_startdir; + FILEDESC_SUNLOCK(fdp); + if (dp->v_type != VDIR) { + vfslocked = VFS_LOCK_GIANT(dp->v_mount); + vrele(dp); + VFS_UNLOCK_GIANT(vfslocked); + uma_zfree(namei_zone, cnp->cn_pnbuf); +#ifdef DIAGNOSTIC + cnp->cn_pnbuf = NULL; + cnp->cn_nameptr = NULL; +#endif + return (ENOTDIR); + } + } else { + dp = fdp->fd_cdir; + VREF(dp); + FILEDESC_SUNLOCK(fdp); + } vfslocked = VFS_LOCK_GIANT(dp->v_mount); - VREF(dp); - FILEDESC_SUNLOCK(fdp); for (;;) { /* * Check if root directory should replace current directory. |
