diff options
| author | ivan <ivan@13f79535-47bb-0310-9956-ffa450edef68> | 2022-06-27 12:12:16 +0000 |
|---|---|---|
| committer | ivan <ivan@13f79535-47bb-0310-9956-ffa450edef68> | 2022-06-27 12:12:16 +0000 |
| commit | bf1548fa54dd86d31d6225658b4e0838f565f8e5 (patch) | |
| tree | c688c5e128d508d109124f2275333baea708fd0e /threadproc | |
| parent | 63a137e5c3f29af217bc3daaf524a5f7e7546d44 (diff) | |
| download | libapr-bf1548fa54dd86d31d6225658b4e0838f565f8e5.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; |
