From e82d75cc2be978b31f6a605309cb94e93743a1aa Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 11 Aug 2000 12:51:47 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 7 ++++++ winsup/cygwin/include/sys/poll.h | 2 +- winsup/cygwin/poll.cc | 41 +++++++++++++++++--------------- 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 + + * 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 * 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; }