summaryrefslogtreecommitdiff
path: root/threadproc
diff options
context:
space:
mode:
authorIvan Zhakov <ivan@apache.org>2022-06-27 12:12:16 +0000
committerIvan Zhakov <ivan@apache.org>2022-06-27 12:12:16 +0000
commitfc17ab1e8415581b23416caa8925602d1e40d100 (patch)
treec688c5e128d508d109124f2275333baea708fd0e /threadproc
parent6ed911f09d0a144f865cc12ce5267c9c507d4cb1 (diff)
downloadapr-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.c4
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;