Module: wine Branch: master Commit: f75a8b3555a8db6276a2edea587d1a1a043b36df URL: https://gitlab.winehq.org/wine/wine/-/commit/f75a8b3555a8db6276a2edea587d1a1...
Author: Paul Gofman pgofman@codeweavers.com Date: Thu Nov 17 14:58:38 2022 -0600
winhttp/tests: Avoid race condition on closing connection in server_thread().
The connection may be cached and checked for availability for request before the server thread closes it.
---
dlls/winhttp/tests/notification.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/winhttp/tests/notification.c b/dlls/winhttp/tests/notification.c index cab297d3f4c..48b0b77ca7c 100644 --- a/dlls/winhttp/tests/notification.c +++ b/dlls/winhttp/tests/notification.c @@ -1401,7 +1401,7 @@ struct server_info };
static int server_socket; -static HANDLE server_socket_available, server_socket_done; +static HANDLE server_socket_available, server_socket_closed, server_socket_done;
static DWORD CALLBACK server_thread(LPVOID param) { @@ -1436,7 +1436,7 @@ static DWORD CALLBACK server_thread(LPVOID param) do { if (c == -1) c = accept(s, NULL, NULL); - + ResetEvent(server_socket_closed); memset(buffer, 0, sizeof buffer); for(i = 0; i < sizeof buffer - 1; i++) { @@ -1463,6 +1463,7 @@ static DWORD CALLBACK server_thread(LPVOID param) } shutdown(c, 2); closesocket(c); + SetEvent(server_socket_closed); c = -1; } while (!last_request);
@@ -1749,6 +1750,7 @@ static void test_persistent_connection(int port)
SetEvent( server_socket_done ); CloseHandle( info.wait ); + WaitForSingleObject( server_socket_closed, INFINITE ); }
struct test_recursion_context @@ -1929,6 +1931,7 @@ START_TEST (notification) ok( thread != NULL, "failed to create thread %lu\n", GetLastError() );
server_socket_available = CreateEventW( NULL, 0, 0, NULL ); + server_socket_closed = CreateEventW( NULL, 0, 0, NULL ); server_socket_done = CreateEventW( NULL, 0, 0, NULL );
ret = WaitForSingleObject( si.event, 10000 ); @@ -1948,4 +1951,5 @@ START_TEST (notification) CloseHandle( thread ); CloseHandle( server_socket_available ); CloseHandle( server_socket_done ); + CloseHandle( server_socket_closed ); }