Apply by doing:
cd /usr/src
patch -p0 < 011_poll.patch
And then rebuild your kernel.
Index: sys/kern/sys_generic.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_generic.c,v
retrieving revision 1.20
retrieving revision 1.22
diff -u -r1.20 -r1.22
--- sys/kern/sys_generic.c 1999/08/04 19:18:13 1.20
+++ sys/kern/sys_generic.c 1999/11/29 22:02:14 1.22
@@ -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.22 1999/11/29 22:02:14 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,19 @@
* 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)
+ 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++) {
@@ -815,10 +823,12 @@
struct timeval atv;
int timo, ncoll, i, s, error, error2;
extern int nselcoll, selwait;
+
+ /* 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);
- /* XXX constrain; This may not match standards */
- if (SCARG(uap, nfds) > p->p_fd->fd_nfiles)
- SCARG(uap, nfds) = p->p_fd->fd_nfiles;
sz = sizeof(struct pollfd) * SCARG(uap, nfds);
/* optimize for the default case, of a small nfds value */