diff options
| author | 1999-11-29 19:56:59 +0000 | |
|---|---|---|
| committer | 1999-11-29 19:56:59 +0000 | |
| commit | e76a246632ce83ad1a548ed3149e7a96e5199a58 (patch) | |
| tree | 5a5c000cce228f84590e830a860a19d159550ed9 /sys/kern/sys_generic.c | |
| parent | Make sure M_BCAST is set for IP broadcasts, even if the packet came in as (diff) | |
| download | wireguard-openbsd-e76a246632ce83ad1a548ed3149e7a96e5199a58.tar.xz wireguard-openbsd-e76a246632ce83ad1a548ed3149e7a96e5199a58.zip | |
handle invalid file descriptors in poll more carefully; d
Diffstat (limited to 'sys/kern/sys_generic.c')
| -rw-r--r-- | sys/kern/sys_generic.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 2cc5a66e27f..85c271a8ba4 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_generic.c,v 1.20 1999/08/04 19:18:13 deraadt Exp $ */ +/* $OpenBSD: sys_generic.c,v 1.21 1999/11/29 19:56:59 deraadt Exp $ */ /* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */ /* @@ -48,6 +48,7 @@ #include <sys/ioctl.h> #include <sys/file.h> #include <sys/proc.h> +#include <sys/resourcevar.h> #include <sys/socketvar.h> #include <sys/signalvar.h> #include <sys/uio.h> @@ -775,12 +776,21 @@ pollscan(p, pl, nfd, retval) * XXX: We need to implement the rest of the flags. */ for (i = 0; i < nfd; i++) { + /* Check the file descriptor. */ + if (pl[i].fd < 0) { + pl[i].revents = 0; + continue; + } + if (pl[i].fd >= fdp->fd_nfiles) { + pl[i].revents = POLLNVAL; + n++; + continue; + } + fp = fdp->fd_ofiles[pl[i].fd]; if (fp == NULL) { - if (pl[i].events & POLLNVAL) { - pl[i].revents |= POLLNVAL; - n++; - } + pl[i].revents = POLLNVAL; + n++; continue; } for (x = msk = 0; msk < 3; msk++) { @@ -816,9 +826,11 @@ sys_poll(p, v, retval) int timo, ncoll, i, s, error, error2; extern int nselcoll, selwait; - /* XXX constrain; This may not match standards */ - if (SCARG(uap, nfds) > p->p_fd->fd_nfiles) - SCARG(uap, nfds) = p->p_fd->fd_nfiles; + /* Standards say no more than MAX_OPEN; this is possibly better. */ + if (SCARG(uap, nfds) > min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, + maxfiles)) + return (EINVAL); + sz = sizeof(struct pollfd) * SCARG(uap, nfds); /* optimize for the default case, of a small nfds value */ |
