Zebediah Figura : kernel32/tests: Add a test for async cancellation due to process exit.

Alexandre Julliard julliard at winehq.org
Thu Feb 25 16:45:36 CST 2021


Module: wine
Branch: master
Commit: 4eddeff18a75445a8dc46829784019add34704eb
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4eddeff18a75445a8dc46829784019add34704eb

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Feb 24 16:11:34 2021 -0600

kernel32/tests: Add a test for async cancellation due to process exit.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/pipe.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 91f6df34f81..f1feb6c53f0 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -4116,6 +4116,66 @@ static void test_GetOverlappedResultEx(void)
     CloseHandle(server);
 }
 
+static void child_process_exit_process_async(DWORD parent_pid, HANDLE parent_pipe)
+{
+    OVERLAPPED overlapped = {0};
+    static char buffer[1];
+    HANDLE parent, pipe;
+    BOOL ret;
+
+    parent = OpenProcess(PROCESS_DUP_HANDLE, FALSE, parent_pid);
+    ok(!!parent, "got parent %p\n", parent);
+
+    ret = DuplicateHandle(parent, parent_pipe, GetCurrentProcess(), &pipe, 0,
+            FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
+    ok(ret, "got error %u\n", GetLastError());
+
+    overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
+
+    ret = ReadFile(pipe, buffer, sizeof(buffer), NULL, &overlapped);
+    ok(!ret, "expected failure\n");
+    ok(GetLastError() == ERROR_IO_PENDING, "got error %u\n", GetLastError());
+
+    /* exit without closing the pipe handle */
+}
+
+static void test_exit_process_async(void)
+{
+    HANDLE client, server, port;
+    OVERLAPPED *overlapped;
+    PROCESS_INFORMATION pi;
+    STARTUPINFOA si = {0};
+    char cmdline[300];
+    ULONG_PTR key;
+    char **argv;
+    DWORD size;
+    BOOL ret;
+
+    winetest_get_mainargs(&argv);
+
+    create_overlapped_pipe(PIPE_TYPE_BYTE, &client, &server);
+    port = CreateIoCompletionPort(client, NULL, 123, 0);
+
+    sprintf(cmdline, "%s pipe exit_process_async %x %p", argv[0], GetCurrentProcessId(), client);
+    ret = CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
+    ok(ret, "got error %u\n", GetLastError());
+    ret = WaitForSingleObject(pi.hProcess, 1000);
+    ok(!ret, "wait timed out\n");
+    CloseHandle(pi.hThread);
+    CloseHandle(pi.hProcess);
+
+    key = 0xdeadbeef;
+    size = 0xdeadbeef;
+    ret = GetQueuedCompletionStatus(port, &size, &key, &overlapped, 1000);
+    ok(!ret, "expected failure\n");
+    todo_wine ok(GetLastError() == ERROR_OPERATION_ABORTED, "got error %u\n", GetLastError());
+    todo_wine ok(!size, "got size %u\n", size);
+    todo_wine ok(key == 123, "got key %Iu\n", key);
+
+    CloseHandle(port);
+    CloseHandle(server);
+}
+
 START_TEST(pipe)
 {
     char **argv;
@@ -4158,6 +4218,15 @@ START_TEST(pipe)
             child_process_check_session_id(id);
             return;
         }
+        if (!strcmp(argv[2], "exit_process_async"))
+        {
+            HANDLE handle;
+            DWORD pid;
+            sscanf(argv[3], "%x", &pid);
+            sscanf(argv[4], "%p", &handle);
+            child_process_exit_process_async(pid, handle);
+            return;
+        }
     }
 
     if (test_DisconnectNamedPipe())
@@ -4186,4 +4255,5 @@ START_TEST(pipe)
     test_nowait(PIPE_TYPE_BYTE);
     test_nowait(PIPE_TYPE_MESSAGE);
     test_GetOverlappedResultEx();
+    test_exit_process_async();
 }




More information about the wine-cvs mailing list