summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorColin Percival <cperciva@FreeBSD.org>2010-01-25 23:48:47 +0000
committerColin Percival <cperciva@FreeBSD.org>2010-01-25 23:48:47 +0000
commit04368fba20168cca086a263d64d6b399a41a13a2 (patch)
treea3b71bfccbf028d9ed62f596c68240b662573f15 /sys/kern
parent570f2897153d11c5df3945e7030eec92ec4fad4c (diff)
Notes
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_lookup.c22
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.