--- 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);