Signed-off-by: Zebediah Figura z.figura12@gmail.com --- Not only were we leaking handles, we previously closed the stop_event handle immediately after setting it, so mutex_thread_proc would sometimes loop forever trying to wait on an invalid handle, causing an intermittent failure both on Wine and on Windows. This patch fixes that failure.
dlls/kernel32/tests/loader.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index 6d532eb..da24c80 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -1752,6 +1752,10 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param) ret = WaitForSingleObject(semaphore, 0); ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %#x\n", ret);
+ CloseHandle(event); + CloseHandle(mutex); + CloseHandle(semaphore); + if (expected_code == STILL_ACTIVE) { ret = WaitForSingleObject(attached_thread[0], 0); @@ -2149,7 +2153,6 @@ static void child_process(const char *dll_name, DWORD target_offset) case 3: trace("signalling thread exit\n"); SetEvent(stop_event); - CloseHandle(stop_event); break;
case 4: @@ -2237,6 +2240,15 @@ static void child_process(const char *dll_name, DWORD target_offset)
*child_failures = winetest_get_failures();
+ CloseHandle(loader_lock_event); + CloseHandle(peb_lock_event); + CloseHandle(heap_lock_event); + CloseHandle(ack_event); + CloseHandle(stop_event); + CloseHandle(process); + /* Don't close event, mutex and semaphore here; we want to test if they are + * abandoned on process termination. */ + trace("call ExitProcess(195)\n"); ExitProcess(195); }