summaryrefslogtreecommitdiff
path: root/threadproc
diff options
context:
space:
mode:
authorIvan Zhakov <ivan@apache.org>2023-01-21 15:52:22 +0000
committerIvan Zhakov <ivan@apache.org>2023-01-21 15:52:22 +0000
commit8907be522b75be547e960c09f86be00fe50fee5b (patch)
tree07157cbab2eb839a9ec3457a4b4ed9e51b69973c /threadproc
parent14cec45a2f46efbb98af8ec1caa35f0df9f65c7b (diff)
downloadapr-8907be522b75be547e960c09f86be00fe50fee5b.tar.gz
Fix potential handle leak when apr_proc_create() is used from from multiple
threads on Windows. * threadproc/win32/proc.c (apr_proc_create): Close our side of pipes before releasing lock: otherwise they could like to other process when apr_proc_create() is used from from multiple threads. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1906885 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'threadproc')
-rw-r--r--threadproc/win32/proc.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/threadproc/win32/proc.c b/threadproc/win32/proc.c
index 0458c1db3..af9d56d8a 100644
--- a/threadproc/win32/proc.c
+++ b/threadproc/win32/proc.c
@@ -915,6 +915,21 @@ APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new,
SetHandleInformation(GetStdHandle(STD_ERROR_HANDLE),
stderr_reset, stderr_reset);
}
+
+ /* Close our side of pipes before releasing lock: otherwise they
+ * could like to other process when apr_proc_create() is used from
+ * from multiple threads.
+ */
+ if ((attr->child_in) && (attr->child_in != &no_file)) {
+ apr_file_close(attr->child_in);
+ }
+ if ((attr->child_out) && (attr->child_out != &no_file)) {
+ apr_file_close(attr->child_out);
+ }
+ if ((attr->child_err) && (attr->child_err != &no_file)) {
+ apr_file_close(attr->child_err);
+ }
+
/* RELEASE CRITICAL SECTION
* The state of the inherited handles has been restored.
*/
@@ -933,15 +948,6 @@ APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new,
new->hproc = pi.hProcess;
new->pid = pi.dwProcessId;
- if ((attr->child_in) && (attr->child_in != &no_file)) {
- apr_file_close(attr->child_in);
- }
- if ((attr->child_out) && (attr->child_out != &no_file)) {
- apr_file_close(attr->child_out);
- }
- if ((attr->child_err) && (attr->child_err != &no_file)) {
- apr_file_close(attr->child_err);
- }
CloseHandle(pi.hThread);
return APR_SUCCESS;