--- select.c.0 Mon Jan 31 08:48:52 2000 +++ select.c Mon Jan 31 10:30:09 2000 @@ -414,11 +414,13 @@ wait = wait_table; } - fds = (struct pollfd **)kmalloc( - (1 + (nfds - 1) / POLLFD_PER_PAGE) * sizeof(struct pollfd *), - GFP_KERNEL); - if (fds == NULL) - goto out; + if (nfds != 0) { + fds = (struct pollfd **)kmalloc( + (1 + (nfds - 1) / POLLFD_PER_PAGE) * sizeof(struct pollfd *), + GFP_KERNEL); + if (fds == NULL) + goto out; + } nchunks = 0; nleft = nfds; @@ -439,11 +441,9 @@ for (i=0; i < nchunks; i++) if (copy_from_user(fds[i], ufds + i*POLLFD_PER_PAGE, PAGE_SIZE)) goto out_fds1; - if (nleft) { - if (copy_from_user(fds[nchunks], ufds + nchunks*POLLFD_PER_PAGE, + if (nleft && copy_from_user(fds[nchunks], ufds + nchunks*POLLFD_PER_PAGE, nleft * sizeof(struct pollfd))) - goto out_fds1; - } + goto out_fds1; lock_kernel(); fdcount = do_poll(nfds, nchunks, nleft, fds, wait, timeout); @@ -467,7 +467,8 @@ out_fds: for (i=0; i < nchunks; i++) free_page((unsigned long)(fds[i])); - kfree(fds); + if (nfds != 0) + kfree(fds); out: if (wait) free_wait(wait_table); .