From 0e058776c02cf8ddc753a36f9cde98cc87899d51 Mon Sep 17 00:00:00 2001 From: Marc Hoersken Date: Sat, 18 Apr 2020 21:54:40 +0200 Subject: sockfilt: make select_ws stop waiting on exit signal event This makes sure that select_ws behaves similar to real select which stops waiting on a signal handler being triggered. This makes it possible to gracefully stop sockfilt.exe on Windows with taskkill /IM sockfilt.exe (without /F force flag). Reviewed-by: Jay Satiro Part of #5260 --- tests/server/sockfilt.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c index 84c72f960..7f0db92b4 100644 --- a/tests/server/sockfilt.c +++ b/tests/server/sockfilt.c @@ -676,7 +676,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, } /* allocate internal array for the internal event handles */ - handles = calloc(nfds, sizeof(HANDLE)); + handles = calloc(nfds + 1, sizeof(HANDLE)); if(handles == NULL) { CloseHandle(abort); CloseHandle(mutex); @@ -785,8 +785,18 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, } } + /* wait on the number of handles */ + wait = nfd; + + /* make sure we stop waiting on exit signal event */ + if(exit_event) { + /* we allocated handles nfds + 1 for this */ + handles[nfd] = exit_event; + wait += 1; + } + /* wait for one of the internal handles to trigger */ - wait = WaitForMultipleObjectsEx(nfd, handles, FALSE, timeout_ms, FALSE); + wait = WaitForMultipleObjectsEx(wait, handles, FALSE, timeout_ms, FALSE); /* wait for internal mutex to lock event handling in threads */ WaitForSingleObjectEx(mutex, INFINITE, FALSE); -- cgit v1.2.3