1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

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.

(cherry picked from commit f75a8b3555)
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
This commit is contained in:
Paul Gofman 2022-11-17 14:58:38 -06:00 committed by Alexandre Julliard
parent 88c2d88df0
commit 7bd2197b60

View file

@ -858,7 +858,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)
{
@ -893,7 +893,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++)
{
@ -920,6 +920,7 @@ static DWORD CALLBACK server_thread(LPVOID param)
}
shutdown(c, 2);
closesocket(c);
SetEvent(server_socket_closed);
c = -1;
} while (!last_request);
@ -1206,6 +1207,7 @@ static void test_persistent_connection(int port)
SetEvent( server_socket_done );
CloseHandle( info.wait );
WaitForSingleObject( server_socket_closed, INFINITE );
}
struct test_recursion_context
@ -1390,6 +1392,7 @@ START_TEST (notification)
ok(thread != NULL, "failed to create thread %u\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 );
@ -1409,4 +1412,5 @@ START_TEST (notification)
CloseHandle( thread );
CloseHandle( server_socket_available );
CloseHandle( server_socket_done );
CloseHandle( server_socket_closed );
}