From 3aa6b2ca26ffaeeb2e3fb7a7c725829df8ad3601 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 25 Apr 2005 23:51:33 +0000 Subject: [PATCH] * event-loop.c (gdb_select): Program defensively. --- gdb/ChangeLog | 2 ++ gdb/event-loop.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c4a9b6d24d1..34cbd8c4534 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,7 @@ 2005-04-25 Mark Mitchell + * event-loop.c (gdb_select): Program defensively. + * event-loop.c (gdb_assert.h): Include. (): Include under Windows. (): Likeiwse. 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; -- 2.30.2