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