From bfbf894c825667b4b8b5afa157601fe3c9541d3d Mon Sep 17 00:00:00 2001 From: alfred Date: Fri, 1 Feb 2002 18:27:16 +0000 Subject: Don't recurse on filedesc lock in chroot_refuse_vdir_fds(). Noticed by: Michael Nottebrock --- sys/kern/vfs_extattr.c | 17 +++++++++-------- sys/kern/vfs_syscalls.c | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) (limited to 'sys') 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); -- cgit v1.1