[PATCH] kernel32/tests: Fix a race condition in test_WaitForJobObject().

Francois Gouget fgouget at codeweavers.com
Wed Mar 11 03:28:44 CDT 2020


Synchronize with the child process to ensure it does not exit before
being added to the test job.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48642
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 dlls/kernel32/tests/process.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index b5ed99062e9..7cd8e3140e8 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2759,7 +2759,8 @@ static void test_KillOnJobClose(void)
 
 static void test_WaitForJobObject(void)
 {
-    HANDLE job;
+    HANDLE job, sem;
+    char buffer[50];
     PROCESS_INFORMATION pi;
     BOOL ret;
     DWORD dwret;
@@ -2826,10 +2827,13 @@ static void test_WaitForJobObject(void)
     dwret = WaitForSingleObject(job, 100);
     ok(dwret == WAIT_TIMEOUT, "WaitForSingleObject returned %u\n", dwret);
 
-    create_process("exit", &pi);
+    sprintf(buffer, "sync kernel32-process-%x", GetCurrentProcessId());
+    sem = CreateSemaphoreA(NULL, 0, 1, buffer);
+    create_process(buffer, &pi);
 
     ret = pAssignProcessToJobObject(job, pi.hProcess);
     ok(ret, "AssignProcessToJobObject error %u\n", GetLastError());
+    ReleaseSemaphore(sem, 1, NULL);
 
     dwret = WaitForSingleObject(job, 100);
     ok(dwret == WAIT_TIMEOUT, "WaitForSingleObject returned %u\n", dwret);
@@ -4047,6 +4051,13 @@ START_TEST(process)
             ok(0, "Child process not killed\n");
             return;
         }
+        else if (!strcmp(myARGV[2], "sync") && myARGC >= 4)
+        {
+            HANDLE sem = CreateSemaphoreA(NULL, 0, 1, myARGV[3]);
+            ok(sem, "Could not get the %s semaphore: le=%u\n", myARGV[3], GetLastError());
+            if (sem) WaitForSingleObject(sem, 30000);
+            return;
+        }
         else if (!strcmp(myARGV[2], "exit"))
         {
             Sleep(100);
-- 
2.20.1



More information about the wine-devel mailing list