From 2699e2c9673de9d67e16a35fa61469e0de89675d Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 25 Apr 2005 23:51:33 +0000 Subject: * event-loop.c (gdb_select): Program defensively. --- gdb/event-loop.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'gdb/event-loop.c') diff --git a/gdb/event-loop.c b/gdb/event-loop.c index 1db32a826ec..2f3d5359b79 100644 --- a/gdb/event-loop.c +++ b/gdb/event-loop.c @@ -760,7 +760,10 @@ gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, if something starts using it. */ gdb_assert (!FD_ISSET (fd, writefds)); if (FD_ISSET (fd, readfds)) - handles[num_handles++] = (HANDLE) _get_osfhandle (fd); + { + gdb_assert (num_handles < MAXIMUM_WAIT_OBJECTS); + handles[num_handles++] = (HANDLE) _get_osfhandle (fd); + } } event = WaitForMultipleObjects (num_handles, handles, @@ -779,15 +782,17 @@ gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, return 0; /* Run through the READFDS, clearing bits corresponding to descriptors for which input is unavailable. */ - num_ready = num_handlers; + num_ready = num_handles; h = handles[event - WAIT_OBJECT_0]; for (fd = 0; fd < n; ++fd) { - HANDLE fd_h = (HANDLE) _get_osfhandle (fd); + HANDLE fd_h; + if (!FD_ISSET (fd, readfds)) + continue; + fd_h = (HANDLE) _get_osfhandle (fd); /* This handle might be ready, even though it wasn't the handle returned by WaitForMultipleObjects. */ - if (FD_ISSET (fd, readfds) && fd_h != h - && WaitForSingleObject (fd_h, 0) != WAIT_OBJECT_0) + if (fd_h != h && WaitForSingleObject (fd_h, 0) != WAIT_OBJECT_0) { FD_CLR (fd, readfds); --num_ready; -- cgit v1.2.1