summaryrefslogtreecommitdiffstats
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2000-08-11 12:51:47 +0000
committerCorinna Vinschen <corinna@vinschen.de>2000-08-11 12:51:47 +0000
commite82d75cc2be978b31f6a605309cb94e93743a1aa (patch)
treef3ae9410292ff482f9eeadf049bdca29775b3cc9 /winsup
parent7b972f5da521138a551a40ed44fd7714ec9b37ef (diff)
downloadcygnal-e82d75cc2be978b31f6a605309cb94e93743a1aa.tar.gz
cygnal-e82d75cc2be978b31f6a605309cb94e93743a1aa.tar.bz2
cygnal-e82d75cc2be978b31f6a605309cb94e93743a1aa.zip
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/include/sys/poll.h2
-rw-r--r--winsup/cygwin/poll.cc41
3 files changed, 30 insertions, 20 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d06ffde98..8b4e903f1 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/include/sys/poll.h b/winsup/cygwin/include/sys/poll.h
index c33639ebb..9f9f05d7f 100644
--- a/winsup/cygwin/include/sys/poll.h
+++ b/winsup/cygwin/include/sys/poll.h
@@ -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. */
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc
index 649adf783..2e2851620 100644
--- a/winsup/cygwin/poll.cc
+++ b/winsup/cygwin/poll.cc
@@ -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;
}