]> sourceware.org Git - newlib-cygwin.git/commitdiff
* poll.cc: Add bounds checking for file descriptors. Return POLLNVAL
authorCorinna Vinschen <corinna@vinschen.de>
Fri, 11 Aug 2000 12:51:47 +0000 (12:51 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Fri, 11 Aug 2000 12:51:47 +0000 (12:51 +0000)
        if fd is invalid. Return POLLERR for each valid fd if cygwin_select
        returned with error.
        include/sys/poll.h: Change POLLERR comment according to above change.

winsup/cygwin/ChangeLog
winsup/cygwin/include/sys/poll.h
winsup/cygwin/poll.cc

index d06ffde98cb5cb4e890b2fd0563f1d80608292ea..8b4e903f12064cc6138bfb97b6d07649e914062c 100644 (file)
@@ -1,3 +1,10 @@
+Fri Aug 11 14:47:00 2000  Corinna Vinschen <corinna@vinschen.de>
+
+       * poll.cc: Add bounds checking for file descriptors. Return POLLNVAL
+       if fd is invalid. Return POLLERR for each valid fd if cygwin_select
+       returned with error.
+       include/sys/poll.h: Change POLLERR comment according to above change.
+
 Thu Aug 10 21:54:29 2000  Christopher Faylor <cgf@cygnus.com>
 
        * syslog.cc (syslog): Use a less malloc-intensive method for allocating
index c33639ebb4a20d752fe9f2271646adc4cd81ac41..9f9f05d7fb06108950a5c17dac2d1dcb859a42a3 100644 (file)
@@ -18,7 +18,7 @@ __BEGIN_DECLS
 #define POLLIN  1       /* Set if data to read. */
 #define POLLPRI 2       /* Set if urgent data to read. */
 #define POLLOUT 4       /* Set if writing data wouldn't block. */
-#define POLLERR   8     /* An error occured, not used by Cygwin. */
+#define POLLERR   8     /* An error occured. */
 #define POLLHUP  16     /* Shutdown or close happened. */
 #define POLLNVAL 32     /* Invalid file descriptor. */
 
index 649adf7832d79353fe488bb42cc6e44d4bdc9744..2e28516202f80e0e4c0f2614698d03edd1101ce3 100644 (file)
@@ -25,7 +25,8 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
   FD_ZERO (&except_fds);
 
   for (unsigned int i = 0; i < nfds; ++i)
-    if (!dtable.not_open (fds[i].fd))
+    if (fds[i].fd < FD_SETSIZE
+        && !dtable.not_open (fds[i].fd))
       {
         FD_SET (fds[i].fd, &open_fds);
         if (fds[i].events & POLLIN)
@@ -41,24 +42,26 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
   int ret = cygwin_select (max_fd + 1, &read_fds, &write_fds, &except_fds,
                            timeout < 0 ? NULL : &tv);
 
-  if (ret >= 0)
-    for (unsigned int i = 0; i < nfds; ++i)
-      {
-        if (!FD_ISSET (fds[i].fd, &open_fds))
-         fds[i].revents = POLLNVAL;
-        else if (dtable.not_open(fds[i].fd))
-         fds[i].revents = POLLHUP;
-        else
-         {
-            fds[i].revents = 0;
-           if (FD_ISSET (fds[i].fd, &read_fds))
-             fds[i].revents |= POLLIN;
-           if (FD_ISSET (fds[i].fd, &write_fds))
-             fds[i].revents |= POLLOUT;
-           if (FD_ISSET (fds[i].fd, &except_fds))
-             fds[i].revents |= POLLPRI;
-         }
-      }
+  for (unsigned int i = 0; i < nfds; ++i)
+    {
+      if (fds[i].fd >= FD_SETSIZE
+          || !FD_ISSET (fds[i].fd, &open_fds))
+        fds[i].revents = POLLNVAL;
+      else if (dtable.not_open(fds[i].fd))
+        fds[i].revents = POLLHUP;
+      else if (ret < 0)
+        fds[i].revents = POLLERR;
+      else
+        {
+          fds[i].revents = 0;
+          if (FD_ISSET (fds[i].fd, &read_fds))
+            fds[i].revents |= POLLIN;
+          if (FD_ISSET (fds[i].fd, &write_fds))
+            fds[i].revents |= POLLOUT;
+          if (FD_ISSET (fds[i].fd, &except_fds))
+            fds[i].revents |= POLLPRI;
+        }
+    }
 
   return ret;
 }
This page took 0.038253 seconds and 5 git commands to generate.