diff options
author | Ivan Zhakov <ivan@apache.org> | 2022-06-27 12:12:16 +0000 |
---|---|---|
committer | Ivan Zhakov <ivan@apache.org> | 2022-06-27 12:12:16 +0000 |
commit | fc17ab1e8415581b23416caa8925602d1e40d100 (patch) | |
tree | c688c5e128d508d109124f2275333baea708fd0e /threadproc | |
parent | 6ed911f09d0a144f865cc12ce5267c9c507d4cb1 (diff) | |
download | apr-fc17ab1e8415581b23416caa8925602d1e40d100.tar.gz |
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
Diffstat (limited to 'threadproc')
-rw-r--r-- | threadproc/win32/thread.c | 4 |
1 files changed, 3 insertions, 1 deletions
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; |