summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2002-02-01 18:27:16 +0000
committeralfred <alfred@FreeBSD.org>2002-02-01 18:27:16 +0000
commitbfbf894c825667b4b8b5afa157601fe3c9541d3d (patch)
treecc44e72b91fe4da56762b1f4cd5f072908c9dea3 /sys
parent170a7bc58bce2fa9766618d7cff7509373d25502 (diff)
downloadFreeBSD-src-bfbf894c825667b4b8b5afa157601fe3c9541d3d.zip
FreeBSD-src-bfbf894c825667b4b8b5afa157601fe3c9541d3d.tar.gz
Don't recurse on filedesc lock in chroot_refuse_vdir_fds().
Noticed by: Michael Nottebrock <michaelnottebrock@gmx.net>
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_extattr.c17
-rw-r--r--sys/kern/vfs_syscalls.c17
2 files changed, 18 insertions, 16 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index 539c418..b8ad69e 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);
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 539c418..b8ad69e 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.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);
OpenPOWER on IntegriCloud