diff options
author | Alfred Perlstein <alfred@FreeBSD.org> | 2002-02-01 18:27:16 +0000 |
---|---|---|
committer | Alfred Perlstein <alfred@FreeBSD.org> | 2002-02-01 18:27:16 +0000 |
commit | b7184973ed02d7aab639916a6ce591ea97ec897d (patch) | |
tree | cc44e72b91fe4da56762b1f4cd5f072908c9dea3 /sys/kern/vfs_extattr.c | |
parent | 11b18c453939749bdbad4bb4a56fd10e39b53e64 (diff) | |
download | src-b7184973ed02d7aab639916a6ce591ea97ec897d.tar.gz src-b7184973ed02d7aab639916a6ce591ea97ec897d.zip |
Don't recurse on filedesc lock in chroot_refuse_vdir_fds().
Noticed by: Michael Nottebrock <michaelnottebrock@gmx.net>
Notes
Notes:
svn path=/head/; revision=90079
Diffstat (limited to 'sys/kern/vfs_extattr.c')
-rw-r--r-- | sys/kern/vfs_extattr.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 539c418c60e2..b8ad69e97a8a 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -997,15 +997,16 @@ chroot_refuse_vdir_fds(fdp) FILEDESC_LOCK(fdp); for (fd = 0; fd < fdp->fd_nfiles ; fd++) { - error = getvnode(fdp, fd, &fp); - if (error) - continue; - vp = (struct vnode *)fp->f_data; - fdrop(fp, td); - if (vp->v_type != VDIR) + fp = fget_locked(fdp, fd); + if (fp == NULL) continue; - FILEDESC_UNLOCK(fdp); - return(EPERM); + if (fp->f_type == DTYPE_VNODE) { + vp = (struct vnode *)fp->f_data; + if (vp->v_type == VDIR) { + FILEDESC_UNLOCK(fdp); + return (EPERM); + } + } } FILEDESC_UNLOCK(fdp); return (0); |