From: Jinoh Kang jinoh.kang.kr@gmail.com
Today, the driver_netio test client binds a new socket to a specific network port. This triggers a firewall alert on Windows 7, and the alert UI window may interfere with user32:msg tests.
Fix this by binding to a dynamically-allocated port instead.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53891 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54202 --- dlls/ntoskrnl.exe/tests/driver.h | 1 - dlls/ntoskrnl.exe/tests/driver_netio.c | 10 ++++---- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 32 ++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/driver.h b/dlls/ntoskrnl.exe/tests/driver.h index 774908a5c4a..6d3f5643aec 100644 --- a/dlls/ntoskrnl.exe/tests/driver.h +++ b/dlls/ntoskrnl.exe/tests/driver.h @@ -77,4 +77,3 @@ struct return_status_params static const GUID control_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc0}};
#define SERVER_LISTEN_PORT 9374 -#define CLIENT_LISTEN_PORT 9375 diff --git a/dlls/ntoskrnl.exe/tests/driver_netio.c b/dlls/ntoskrnl.exe/tests/driver_netio.c index e406f49eacb..528356b923c 100644 --- a/dlls/ntoskrnl.exe/tests/driver_netio.c +++ b/dlls/ntoskrnl.exe/tests/driver_netio.c @@ -381,9 +381,10 @@ static void test_wsk_listen_socket(void) ExFreePool(buffer2); }
-static void test_wsk_connect_socket(void) +static void test_wsk_connect_socket(ULONG_PTR parameter) { const WSK_PROVIDER_CONNECTION_DISPATCH *connect_dispatch; + USHORT client_listen_port = (USHORT)parameter; struct socket_context context; struct sockaddr_in addr; LARGE_INTEGER timeout; @@ -409,7 +410,7 @@ static void test_wsk_connect_socket(void)
memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; - addr.sin_port = htons(CLIENT_LISTEN_PORT); + addr.sin_port = htons(client_listen_port); addr.sin_addr.s_addr = htonl(0x7f000001);
IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); @@ -437,7 +438,7 @@ static void test_wsk_connect_socket(void) ok(!wsk_irp->IoStatus.Information, "Got unexpected Information %#Ix.\n", wsk_irp->IoStatus.Information);
- addr.sin_port = htons(CLIENT_LISTEN_PORT); + addr.sin_port = htons(client_listen_port); addr.sin_addr.s_addr = htonl(0x7f000001);
IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); @@ -466,6 +467,7 @@ static void test_wsk_connect_socket(void) static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack) { void *buffer = irp->AssociatedIrp.SystemBuffer; + struct main_test_input *test_input = buffer;
if (!buffer) return STATUS_ACCESS_VIOLATION; @@ -473,7 +475,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st netio_init(); test_wsk_get_address_info(); test_wsk_listen_socket(); - test_wsk_connect_socket(); + test_wsk_connect_socket(test_input->parameter);
irp->IoStatus.Information = 0; return STATUS_SUCCESS; diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index e80b2368352..ee1516fc887 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1170,14 +1170,21 @@ static void test_driver3(struct testsign_context *ctx) DeleteFileW(filename); }
+struct wsk_test_cb +{ + HANDLE client_started_event; + USHORT client_listen_port; +}; + static DWORD WINAPI wsk_test_thread(void *parameter) { static const char test_send_string[] = "Client test string 1."; static const WORD version = MAKEWORD(2, 2); SOCKET s_listen, s_accept, s_connect; + struct wsk_test_cb *cb = parameter; struct sockaddr_in addr; + int ret, err, socklen; char buffer[256]; - int ret, err; WSADATA data; int opt_val;
@@ -1195,7 +1202,6 @@ static DWORD WINAPI wsk_test_thread(void *parameter)
memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; - addr.sin_port = htons(CLIENT_LISTEN_PORT); addr.sin_addr.s_addr = htonl(0x7f000001); ret = bind(s_listen, (struct sockaddr *)&addr, sizeof(addr)); ok(!ret, "Got unexpected ret %d, WSAGetLastError() %u.\n", ret, WSAGetLastError()); @@ -1203,6 +1209,13 @@ static DWORD WINAPI wsk_test_thread(void *parameter) ret = listen(s_listen, SOMAXCONN); ok(!ret, "Got unexpected ret %d, WSAGetLastError() %u.\n", ret, WSAGetLastError());
+ ret = getsockname(s_listen, (struct sockaddr *)&addr, &socklen); + ok(!ret, "Got unexpected ret %d, WSAGetLastError() %u.\n", ret, WSAGetLastError()); + ok(socklen == sizeof(addr), "expected %Iu, got %d.\n", sizeof(addr), socklen); + + cb->client_listen_port = ntohs(addr.sin_port); + SetEvent(cb->client_started_event); + addr.sin_port = htons(SERVER_LISTEN_PORT);
ret = connect(s_connect, (struct sockaddr *)&addr, sizeof(addr)); @@ -1231,6 +1244,7 @@ static DWORD WINAPI wsk_test_thread(void *parameter)
static void test_driver_netio(struct testsign_context *ctx) { + struct wsk_test_cb cb = { NULL }; WCHAR filename[MAX_PATH]; SC_HANDLE service; HANDLE hthread; @@ -1248,10 +1262,20 @@ static void test_driver_netio(struct testsign_context *ctx) device = CreateFileA("\\.\winetest_netio", 0, 0, NULL, OPEN_EXISTING, 0, NULL); ok(device != INVALID_HANDLE_VALUE, "failed to open device: %lu\n", GetLastError());
- hthread = CreateThread(NULL, 0, wsk_test_thread, NULL, 0, NULL); - main_test(0); + cb.client_started_event = CreateEventW(NULL, FALSE, FALSE, NULL); + ok(cb.client_started_event != NULL, "CreateEventW returned error %lu\n", GetLastError()); + + hthread = CreateThread(NULL, 0, wsk_test_thread, &cb, 0, NULL); + ok(hthread != NULL, "CreateThread returned error %lu\n", GetLastError()); + + WaitForSingleObject(cb.client_started_event, INFINITE); + ok(cb.client_listen_port != 0, "Could not bind socket.\n"); + + main_test(cb.client_listen_port); WaitForSingleObject(hthread, INFINITE);
+ CloseHandle(hthread); + CloseHandle(cb.client_started_event); CloseHandle(device);
unload_driver(service);