From bf1548fa54dd86d31d6225658b4e0838f565f8e5 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 27 Jun 2022 12:12:16 +0000 Subject: win32: Fix potential race condition in apr_thread_create. * CHANGES: Add changelog entry. * threadproc/win32/thread.c (apr_thread_create): Create suspended thread, initialize apr_thread_t->td and only after that resume thread. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1902277 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 2 ++ threadproc/win32/thread.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 332d60327..4b5d3456f 100644 --- a/CHANGES +++ b/CHANGES @@ -266,6 +266,8 @@ Changes for APR 2.0.0 *) Fix double free on exit when apr_app is used on Windows. [Ivan Zhakov] + *) apr_thread_create: Fix potential race condition on Windows. [Ivan Zhakov] + Changes for APR and APR-util 1.7.x and later: *) http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/CHANGES?view=markup diff --git a/threadproc/win32/thread.c b/threadproc/win32/thread.c index c49038361..0b672e698 100644 --- a/threadproc/win32/thread.c +++ b/threadproc/win32/thread.c @@ -157,17 +157,19 @@ APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new, if ((handle = (HANDLE)_beginthreadex(NULL, (DWORD) (attr ? attr->stacksize : 0), dummy_worker, - (*new), 0, &temp)) == 0) { + (*new), CREATE_SUSPENDED, &temp)) == 0) { stat = APR_FROM_OS_ERROR(_doserrno); apr_pool_destroy((*new)->pool); return stat; } if (attr && attr->detach) { + ResumeThread(handle); CloseHandle(handle); } else { (*new)->td = handle; + ResumeThread(handle); } return APR_SUCCESS; -- cgit v1.2.1