aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2026-02-04 07:22:11 +0100
committerNIIBE Yutaka <[email protected]>2026-02-04 07:22:11 +0100
commit97c0106a9a771fe015ceb5585b3c10a78663e1fd (patch)
tree27bbd498ab35572aa5f8fc6d74137fb562b13e5d
parentspawn:w32: Fix preparing the environment block. (diff)
downloadlibgpg-error-97c0106a9a771fe015ceb5585b3c10a78663e1fd.tar.gz
libgpg-error-97c0106a9a771fe015ceb5585b3c10a78663e1fd.zip
spawn:w32: Fix with GPGRT_PROCESS_*_KEEP flags.
* src/spawn-w32.c (_gpgrt_process_spawn): Don't close the handle when GPGRT_PROCESS_*_KEEP is specified. -- GnuPG-bug-id: 8052 Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--src/spawn-w32.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/spawn-w32.c b/src/spawn-w32.c
index ad5793c..c85be91 100644
--- a/src/spawn-w32.c
+++ b/src/spawn-w32.c
@@ -743,19 +743,22 @@ _gpgrt_process_spawn (const char *pgmname, const char *argv[],
if (si.lpAttributeList == NULL)
{
if (hd_in[0] != INVALID_HANDLE_VALUE
- && hd_in[0] != act->hd[0])
+ && hd_in[0] != act->hd[0]
+ && !(flags & GPGRT_PROCESS_STDIN_KEEP))
CloseHandle (hd_in[0]);
if ((flags & GPGRT_PROCESS_STDIN_PIPE))
CloseHandle (hd_in[1]);
if ((flags & GPGRT_PROCESS_STDOUT_PIPE))
CloseHandle (hd_out[0]);
if (hd_out[1] != INVALID_HANDLE_VALUE
- && hd_out[1] != act->hd[1])
+ && hd_out[1] != act->hd[1]
+ && !(flags & GPGRT_PROCESS_STDOUT_KEEP))
CloseHandle (hd_out[1]);
if ((flags & GPGRT_PROCESS_STDERR_PIPE))
CloseHandle (hd_err[0]);
if (hd_err[1] != INVALID_HANDLE_VALUE
- && hd_err[1] != act->hd[2])
+ && hd_err[1] != act->hd[2]
+ && !(flags & GPGRT_PROCESS_STDERR_KEEP))
CloseHandle (hd_err[1]);
xfree (process);
xfree (cmdline);
@@ -858,17 +861,20 @@ _gpgrt_process_spawn (const char *pgmname, const char *argv[],
else
_gpgrt_log_info ("CreateProcess failed: ec=%d\n",
(int)GetLastError ());
- if (hd_in[0] != INVALID_HANDLE_VALUE && hd_in[0] != act->hd[0])
+ if (hd_in[0] != INVALID_HANDLE_VALUE && hd_in[0] != act->hd[0]
+ && !(flags & GPGRT_PROCESS_STDIN_KEEP))
CloseHandle (hd_in[0]);
if ((flags & GPGRT_PROCESS_STDIN_PIPE))
CloseHandle (hd_in[1]);
if ((flags & GPGRT_PROCESS_STDOUT_PIPE))
CloseHandle (hd_out[0]);
- if (hd_out[1] != INVALID_HANDLE_VALUE && hd_out[1] != act->hd[1])
+ if (hd_out[1] != INVALID_HANDLE_VALUE && hd_out[1] != act->hd[1]
+ && !(flags & GPGRT_PROCESS_STDOUT_KEEP))
CloseHandle (hd_out[1]);
if ((flags & GPGRT_PROCESS_STDERR_PIPE))
CloseHandle (hd_err[0]);
- if (hd_err[1] != INVALID_HANDLE_VALUE && hd_err[1] != act->hd[2])
+ if (hd_err[1] != INVALID_HANDLE_VALUE && hd_err[1] != act->hd[2]
+ && !(flags & GPGRT_PROCESS_STDERR_KEEP))
CloseHandle (hd_err[1]);
_gpgrt_free_wchar (wpgmname);
_gpgrt_free_wchar (wcmdline);
@@ -881,11 +887,14 @@ _gpgrt_process_spawn (const char *pgmname, const char *argv[],
_gpgrt_free_wchar (wcmdline);
xfree (cmdline);
- if (hd_in[0] != INVALID_HANDLE_VALUE && hd_in[0] != act->hd[0])
+ if (hd_in[0] != INVALID_HANDLE_VALUE && hd_in[0] != act->hd[0]
+ && !(flags & GPGRT_PROCESS_STDIN_KEEP))
CloseHandle (hd_in[0]);
- if (hd_out[1] != INVALID_HANDLE_VALUE && hd_out[1] != act->hd[1])
+ if (hd_out[1] != INVALID_HANDLE_VALUE && hd_out[1] != act->hd[1]
+ && !(flags & GPGRT_PROCESS_STDOUT_KEEP))
CloseHandle (hd_out[1]);
- if (hd_err[1] != INVALID_HANDLE_VALUE && hd_err[1] != act->hd[2])
+ if (hd_err[1] != INVALID_HANDLE_VALUE && hd_err[1] != act->hd[2]
+ && !(flags & GPGRT_PROCESS_STDERR_KEEP))
CloseHandle (hd_err[1]);
/* log_debug ("CreateProcess ready: hProcess=%p hThread=%p" */