Apply by doing:
cd /usr/src
patch -p0 < 031_scarg.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.29
retrieving revision 1.29.2.1
diff -u -r1.29 -r1.29.2.1
--- sys/kern/sys_generic.c 16 May 2001 12:52:58 -0000 1.29
+++ sys/kern/sys_generic.c 11 Aug 2002 12:54:32 -0000 1.29.2.1
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_generic.c,v 1.29 2001/05/16 12:52:58 ho Exp $ */
+/* $OpenBSD: sys_generic.c,v 1.29.2.1 2002/08/11 12:54:32 miod Exp $ */
/* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */
/*
@@ -666,12 +666,9 @@
* Select system call.
*/
int
-sys_select(p, v, retval)
- register struct proc *p;
- void *v;
- register_t *retval;
+sys_select(struct proc *p, void *v, register_t *retval)
{
- register struct sys_select_args /* {
+ struct sys_select_args /* {
syscallarg(int) nd;
syscallarg(fd_set *) in;
syscallarg(fd_set *) ou;
@@ -681,14 +678,15 @@
fd_set bits[6], *pibits[3], *pobits[3];
struct timeval atv;
int s, ncoll, error = 0, timo;
- u_int ni;
+ u_int nd, ni;
- if (SCARG(uap, nd) > p->p_fd->fd_nfiles) {
+ nd = SCARG(uap, nd);
+ if (nd > p->p_fd->fd_nfiles) {
/* forgiving; slightly wrong */
- SCARG(uap, nd) = p->p_fd->fd_nfiles;
+ nd = p->p_fd->fd_nfiles;
}
- ni = howmany(SCARG(uap, nd), NFDBITS) * sizeof(fd_mask);
- if (SCARG(uap, nd) > FD_SETSIZE) {
+ ni = howmany(nd, NFDBITS) * sizeof(fd_mask);
+ if (nd > FD_SETSIZE) {
caddr_t mbits;
mbits = malloc(ni * 6, M_TEMP, M_WAITOK);
@@ -735,7 +733,7 @@
retry:
ncoll = nselcoll;
p->p_flag |= P_SELECT;
- error = selscan(p, pibits[0], pobits[0], SCARG(uap, nd), retval);
+ error = selscan(p, pibits[0], pobits[0], nd, retval);
if (error || *retval)
goto done;
if (SCARG(uap, tv)) {
@@ -943,10 +941,7 @@
* differently.
*/
int
-sys_poll(p, v, retval)
- register struct proc *p;
- void *v;
- register_t *retval;
+sys_poll(struct proc *p, void *v, register_t *retval)
{
struct sys_poll_args *uap = v;
size_t sz;
@@ -955,13 +950,13 @@
struct timeval atv;
int timo, ncoll, i, s, error, error2;
extern int nselcoll, selwait;
+ u_int nfds = SCARG(uap, nfds);
/* 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))
+ if (nfds > min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfiles))
return (EINVAL);
- sz = sizeof(struct pollfd) * SCARG(uap, nfds);
+ sz = sizeof(struct pollfd) * nfds;
/* optimize for the default case, of a small nfds value */
if (sz > sizeof(pfds))
@@ -970,7 +965,7 @@
if ((error = copyin(SCARG(uap, fds), pl, sz)) != 0)
goto bad;
- for (i = 0; i < SCARG(uap, nfds); i++)
+ for (i = 0; i < nfds; i++)
pl[i].revents = 0;
if (msec != -1) {
@@ -990,7 +985,7 @@
retry:
ncoll = nselcoll;
p->p_flag |= P_SELECT;
- pollscan(p, pl, SCARG(uap, nfds), retval);
+ pollscan(p, pl, nfds, retval);
if (*retval)
goto done;
if (msec != -1) {