* 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.
This commit is contained in:
parent
7b972f5da5
commit
e82d75cc2b
@ -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>
|
Thu Aug 10 21:54:29 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* syslog.cc (syslog): Use a less malloc-intensive method for allocating
|
* syslog.cc (syslog): Use a less malloc-intensive method for allocating
|
||||||
|
@ -18,7 +18,7 @@ __BEGIN_DECLS
|
|||||||
#define POLLIN 1 /* Set if data to read. */
|
#define POLLIN 1 /* Set if data to read. */
|
||||||
#define POLLPRI 2 /* Set if urgent data to read. */
|
#define POLLPRI 2 /* Set if urgent data to read. */
|
||||||
#define POLLOUT 4 /* Set if writing data wouldn't block. */
|
#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 POLLHUP 16 /* Shutdown or close happened. */
|
||||||
#define POLLNVAL 32 /* Invalid file descriptor. */
|
#define POLLNVAL 32 /* Invalid file descriptor. */
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
|
|||||||
FD_ZERO (&except_fds);
|
FD_ZERO (&except_fds);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < nfds; ++i)
|
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);
|
FD_SET (fds[i].fd, &open_fds);
|
||||||
if (fds[i].events & POLLIN)
|
if (fds[i].events & POLLIN)
|
||||||
@ -41,13 +42,15 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
|
|||||||
int ret = cygwin_select (max_fd + 1, &read_fds, &write_fds, &except_fds,
|
int ret = cygwin_select (max_fd + 1, &read_fds, &write_fds, &except_fds,
|
||||||
timeout < 0 ? NULL : &tv);
|
timeout < 0 ? NULL : &tv);
|
||||||
|
|
||||||
if (ret >= 0)
|
|
||||||
for (unsigned int i = 0; i < nfds; ++i)
|
for (unsigned int i = 0; i < nfds; ++i)
|
||||||
{
|
{
|
||||||
if (!FD_ISSET (fds[i].fd, &open_fds))
|
if (fds[i].fd >= FD_SETSIZE
|
||||||
|
|| !FD_ISSET (fds[i].fd, &open_fds))
|
||||||
fds[i].revents = POLLNVAL;
|
fds[i].revents = POLLNVAL;
|
||||||
else if (dtable.not_open(fds[i].fd))
|
else if (dtable.not_open(fds[i].fd))
|
||||||
fds[i].revents = POLLHUP;
|
fds[i].revents = POLLHUP;
|
||||||
|
else if (ret < 0)
|
||||||
|
fds[i].revents = POLLERR;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fds[i].revents = 0;
|
fds[i].revents = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user