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 */