diff options
author | 2018-04-27 10:13:37 +0000 | |
---|---|---|
committer | 2018-04-27 10:13:37 +0000 | |
commit | bae06bfd75bcb8885bc04d9fe10305e524033034 (patch) | |
tree | ad4a6e0b5abd8a9edfa739c503bfa699b5af75c3 | |
parent | Fix an off-by-one in xhci_xfer_tdsize(). (diff) | |
download | wireguard-openbsd-bae06bfd75bcb8885bc04d9fe10305e524033034.tar.xz wireguard-openbsd-bae06bfd75bcb8885bc04d9fe10305e524033034.zip |
Move FREF() inside fd_getfile().
ok visa@
-rw-r--r-- | sys/kern/kern_descrip.c | 24 | ||||
-rw-r--r-- | sys/kern/kern_event.c | 4 | ||||
-rw-r--r-- | sys/kern/kern_exec.c | 4 | ||||
-rw-r--r-- | sys/kern/sys_generic.c | 11 | ||||
-rw-r--r-- | sys/kern/uipc_syscalls.c | 3 | ||||
-rw-r--r-- | sys/kern/uipc_usrreq.c | 3 | ||||
-rw-r--r-- | sys/kern/vfs_lookup.c | 3 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 9 | ||||
-rw-r--r-- | sys/miscfs/fuse/fuse_vfsops.c | 3 | ||||
-rw-r--r-- | sys/uvm/uvm_mmap.c | 4 |
10 files changed, 23 insertions, 45 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index aea5be59539..f5e98872df6 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_descrip.c,v 1.153 2018/04/26 06:28:43 mpi Exp $ */ +/* $OpenBSD: kern_descrip.c,v 1.154 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: kern_descrip.c,v 1.42 1996/03/30 22:24:38 christos Exp $ */ /* @@ -212,6 +212,7 @@ fd_getfile(struct filedesc *fdp, int fd) if (!FILE_IS_USABLE(fp)) return (NULL); + FREF(fp); return (fp); } @@ -223,9 +224,13 @@ fd_getfile_mode(struct filedesc *fdp, int fd, int mode) KASSERT(mode != 0); fp = fd_getfile(fdp, fd); + if (fp == NULL) + return (NULL); - if (fp == NULL || (fp->f_flag & mode) == 0) + if ((fp->f_flag & mode) == 0) { + FRELE(fp, curproc); return (NULL); + } return (fp); } @@ -252,7 +257,6 @@ sys_dup(struct proc *p, void *v, register_t *retval) restart: if ((fp = fd_getfile(fdp, old)) == NULL) return (EBADF); - FREF(fp); fdplock(fdp); if ((error = fdalloc(p, 0, &new)) != 0) { FRELE(fp, p); @@ -312,7 +316,6 @@ dodup3(struct proc *p, int old, int new, int flags, register_t *retval) restart: if ((fp = fd_getfile(fdp, old)) == NULL) return (EBADF); - FREF(fp); if ((u_int)new >= p->p_rlimit[RLIMIT_NOFILE].rlim_cur || (u_int)new >= maxfiles) { FRELE(fp, p); @@ -379,7 +382,6 @@ sys_fcntl(struct proc *p, void *v, register_t *retval) restart: if ((fp = fd_getfile(fdp, fd)) == NULL) return (EBADF); - FREF(fp); switch (SCARG(uap, cmd)) { case F_DUPFD: @@ -553,8 +555,6 @@ restart: } fp2 = fd_getfile(fdp, fd); - if (fp2 != NULL) - FREF(fp2); if (fp != fp2) { /* * We have lost the race with close() or dup2(); @@ -701,9 +701,13 @@ sys_close(struct proc *p, void *v, register_t *retval) } */ *uap = v; int fd = SCARG(uap, fd), error; struct filedesc *fdp = p->p_fd; + struct file *fp; - if (fd_getfile(fdp, fd) == NULL) + fp = fd_getfile(fdp, fd); + if (fp == NULL) return (EBADF); + FRELE(fp, p); + fdplock(fdp); error = fdrelease(p, fd); fdpunlock(fdp); @@ -729,7 +733,6 @@ sys_fstat(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile(fdp, fd)) == NULL) return (EBADF); - FREF(fp); error = (*fp->f_ops->fo_stat)(fp, &ub, p); FRELE(fp, p); if (error == 0) { @@ -767,7 +770,6 @@ sys_fpathconf(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile(fdp, fd)) == NULL) return (EBADF); - FREF(fp); switch (fp->f_type) { case DTYPE_PIPE: case DTYPE_SOCKET: @@ -1220,7 +1222,6 @@ sys_flock(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile(fdp, fd)) == NULL) return (EBADF); - FREF(fp); if (fp->f_type != DTYPE_VNODE) { error = EOPNOTSUPP; goto out; @@ -1309,7 +1310,6 @@ dupfdopen(struct proc *p, int indx, int mode) */ if ((wfp = fd_getfile(fdp, dupfd)) == NULL) return (EBADF); - FREF(wfp); /* * Check that the mode the file is being opened for is a diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 0fbef3a4271..dd5cb18d748 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_event.c,v 1.87 2018/04/10 09:17:45 mpi Exp $ */ +/* $OpenBSD: kern_event.c,v 1.88 2018/04/27 10:13:37 mpi Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -481,7 +481,6 @@ sys_kevent(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL) return (EBADF); - FREF(fp); if (fp->f_type != DTYPE_KQUEUE) { error = EBADF; @@ -583,7 +582,6 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct proc *p) return (EBADF); if ((fp = fd_getfile(fdp, kev->ident)) == NULL) return (EBADF); - FREF(fp); if (kev->ident < fdp->fd_knlistsize) { SLIST_FOREACH(kn, &fdp->fd_knlist[kev->ident], kn_link) { diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 7aa601f43a3..0cee0b3a6d8 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exec.c,v 1.193 2018/01/02 06:38:45 guenther Exp $ */ +/* $OpenBSD: kern_exec.c,v 1.194 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $ */ /*- @@ -608,6 +608,8 @@ sys_execve(struct proc *p, void *v, register_t *retval) fp->f_ops = &vnops; fp->f_data = (caddr_t)vp; FILE_SET_MATURE(fp, p); + } else { + FRELE(fp, p); } } fdpunlock(p->p_fd); diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 9ebb22e9f29..2bcf1804ec0 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_generic.c,v 1.117 2018/04/09 09:53:13 mpi Exp $ */ +/* $OpenBSD: sys_generic.c,v 1.118 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */ /* @@ -94,8 +94,6 @@ sys_read(struct proc *p, void *v, register_t *retval) iov.iov_base = SCARG(uap, buf); iov.iov_len = SCARG(uap, nbyte); - FREF(fp); - /* dofilereadv() will FRELE the descriptor for us */ return (dofilereadv(p, fd, fp, &iov, 1, 0, &fp->f_offset, retval)); } @@ -117,7 +115,6 @@ sys_readv(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile_mode(fdp, fd, FREAD)) == NULL) return (EBADF); - FREF(fp); /* dofilereadv() will FRELE the descriptor for us */ return (dofilereadv(p, fd, fp, SCARG(uap, iovp), SCARG(uap, iovcnt), 1, @@ -246,8 +243,6 @@ sys_write(struct proc *p, void *v, register_t *retval) iov.iov_base = (void *)SCARG(uap, buf); iov.iov_len = SCARG(uap, nbyte); - FREF(fp); - /* dofilewritev() will FRELE the descriptor for us */ return (dofilewritev(p, fd, fp, &iov, 1, 0, &fp->f_offset, retval)); } @@ -269,7 +264,6 @@ sys_writev(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile_mode(fdp, fd, FWRITE)) == NULL) return (EBADF); - FREF(fp); /* dofilewritev() will FRELE the descriptor for us */ return (dofilewritev(p, fd, fp, SCARG(uap, iovp), SCARG(uap, iovcnt), 1, @@ -403,7 +397,6 @@ sys_ioctl(struct proc *p, void *v, register_t *retval) fdp = p->p_fd; if ((fp = fd_getfile_mode(fdp, SCARG(uap, fd), FREAD|FWRITE)) == NULL) return (EBADF); - FREF(fp); if (fp->f_type == DTYPE_SOCKET) { struct socket *so = fp->f_data; @@ -745,7 +738,6 @@ selscan(struct proc *p, fd_set *ibits, fd_set *obits, int nfd, int ni, bits &= ~(1 << j); if ((fp = fd_getfile(fdp, fd)) == NULL) return (EBADF); - FREF(fp); if ((*fp->f_ops->fo_poll)(fp, flag[msk], p)) { FD_SET(fd, pobits); n++; @@ -842,7 +834,6 @@ pollscan(struct proc *p, struct pollfd *pl, u_int nfd, register_t *retval) n++; continue; } - FREF(fp); pl->revents = (*fp->f_ops->fo_poll)(fp, pl->events, p); FRELE(fp, p); if (pl->revents != 0) diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index a27c09089ff..ed63535d9e2 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_syscalls.c,v 1.168 2018/03/28 09:54:00 mpi Exp $ */ +/* $OpenBSD: uipc_syscalls.c,v 1.169 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */ /* @@ -1160,7 +1160,6 @@ getsock(struct proc *p, int fdes, struct file **fpp) if ((fp = fd_getfile(p->p_fd, fdes)) == NULL) return (EBADF); - FREF(fp); if (fp->f_type != DTYPE_SOCKET) { FRELE(fp, p); return (ENOTSOCK); diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 5b25914ee8c..8151c653110 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_usrreq.c,v 1.124 2018/04/18 09:56:57 mpi Exp $ */ +/* $OpenBSD: uipc_usrreq.c,v 1.125 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $ */ /* @@ -838,7 +838,6 @@ morespace: error = EBADF; goto fail; } - FREF(fp); if (fp->f_count == LONG_MAX-2) { error = EDEADLK; goto fail; diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index afdf5063ff8..2c63ae415b4 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_lookup.c,v 1.66 2018/04/09 09:59:32 mpi Exp $ */ +/* $OpenBSD: vfs_lookup.c,v 1.67 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: vfs_lookup.c,v 1.17 1996/02/09 19:00:59 christos Exp $ */ /* @@ -190,7 +190,6 @@ fail: pool_put(&namei_pool, cnp->cn_pnbuf); return (EBADF); } - FREF(fp); dp = (struct vnode *)fp->f_data; if (fp->f_type != DTYPE_VNODE || dp->v_type != VDIR) { FRELE(fp, p); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index a28551acd2f..1051bc271b4 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_syscalls.c,v 1.279 2018/04/03 09:10:02 mpi Exp $ */ +/* $OpenBSD: vfs_syscalls.c,v 1.280 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */ /* @@ -745,7 +745,6 @@ sys_fchdir(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL) return (EBADF); - FREF(fp); vp = fp->f_data; if (fp->f_type != DTYPE_VNODE || vp->v_type != VDIR) { FRELE(fp, p); @@ -1616,7 +1615,6 @@ sys_lseek(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL) return (EBADF); - FREF(fp); vp = fp->f_data; if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO) { error = ESPIPE; @@ -2900,7 +2898,6 @@ getvnode(struct proc *p, int fd, struct file **fpp) if ((fp = fd_getfile(p->p_fd, fd)) == NULL) return (EBADF); - FREF(fp); if (fp->f_type != DTYPE_VNODE) { FRELE(fp, p); @@ -2943,7 +2940,6 @@ sys_pread(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile_mode(fdp, fd, FREAD)) == NULL) return (EBADF); - FREF(fp); vp = fp->f_data; if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO || @@ -2983,7 +2979,6 @@ sys_preadv(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile_mode(fdp, fd, FREAD)) == NULL) return (EBADF); - FREF(fp); vp = fp->f_data; if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO || @@ -3028,7 +3023,6 @@ sys_pwrite(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile_mode(fdp, fd, FWRITE)) == NULL) return (EBADF); - FREF(fp); vp = fp->f_data; if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO || @@ -3068,7 +3062,6 @@ sys_pwritev(struct proc *p, void *v, register_t *retval) if ((fp = fd_getfile_mode(fdp, fd, FWRITE)) == NULL) return (EBADF); - FREF(fp); vp = fp->f_data; if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO || diff --git a/sys/miscfs/fuse/fuse_vfsops.c b/sys/miscfs/fuse/fuse_vfsops.c index 6640e4cfb5a..ac4c7e5f1cf 100644 --- a/sys/miscfs/fuse/fuse_vfsops.c +++ b/sys/miscfs/fuse/fuse_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_vfsops.c,v 1.33 2018/03/28 16:34:28 visa Exp $ */ +/* $OpenBSD: fuse_vfsops.c,v 1.34 2018/04/27 10:13:37 mpi Exp $ */ /* * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com> * @@ -84,7 +84,6 @@ fusefs_mount(struct mount *mp, const char *path, void *data, if ((fp = fd_getfile(p->p_fd, args->fd)) == NULL) return (EBADF); - FREF(fp); if (fp->f_type != DTYPE_VNODE) { error = EINVAL; diff --git a/sys/uvm/uvm_mmap.c b/sys/uvm/uvm_mmap.c index 8f8cbb58e8b..11effbc411a 100644 --- a/sys/uvm/uvm_mmap.c +++ b/sys/uvm/uvm_mmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_mmap.c,v 1.149 2018/04/12 17:13:44 deraadt Exp $ */ +/* $OpenBSD: uvm_mmap.c,v 1.150 2018/04/27 10:13:37 mpi Exp $ */ /* $NetBSD: uvm_mmap.c,v 1.49 2001/02/18 21:19:08 chs Exp $ */ /* @@ -434,8 +434,6 @@ sys_mmap(struct proc *p, void *v, register_t *retval) return (EBADF); } - FREF(fp); - if (fp->f_type != DTYPE_VNODE) { error = ENODEV; /* only mmap vnodes! */ goto out; |