summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2018-04-27 10:13:37 +0000
committermpi <mpi@openbsd.org>2018-04-27 10:13:37 +0000
commitbae06bfd75bcb8885bc04d9fe10305e524033034 (patch)
treead4a6e0b5abd8a9edfa739c503bfa699b5af75c3
parentFix an off-by-one in xhci_xfer_tdsize(). (diff)
downloadwireguard-openbsd-bae06bfd75bcb8885bc04d9fe10305e524033034.tar.xz
wireguard-openbsd-bae06bfd75bcb8885bc04d9fe10305e524033034.zip
Move FREF() inside fd_getfile().
ok visa@
-rw-r--r--sys/kern/kern_descrip.c24
-rw-r--r--sys/kern/kern_event.c4
-rw-r--r--sys/kern/kern_exec.c4
-rw-r--r--sys/kern/sys_generic.c11
-rw-r--r--sys/kern/uipc_syscalls.c3
-rw-r--r--sys/kern/uipc_usrreq.c3
-rw-r--r--sys/kern/vfs_lookup.c3
-rw-r--r--sys/kern/vfs_syscalls.c9
-rw-r--r--sys/miscfs/fuse/fuse_vfsops.c3
-rw-r--r--sys/uvm/uvm_mmap.c4
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;