Kien Nguyen
3 months ago
1 changed files with 164 additions and 0 deletions
@ -0,0 +1,164 @@ |
|||
From 6932da3096f8149e0fffe2aba0ab8c444a598476 Mon Sep 17 00:00:00 2001 |
|||
From: Kien Nguyen <kien.n.quang@gmail.com> |
|||
Date: Sun, 4 Aug 2024 04:29:35 -0700 |
|||
Subject: [PATCH 4/6] init_ntproc: Use SetHandleInformation to set NOINHERIT |
|||
when possible |
|||
|
|||
---
|
|||
src/w32.c | 123 ++++++++++++++++++++++++++++++------------------------ |
|||
1 file changed, 68 insertions(+), 55 deletions(-) |
|||
|
|||
diff --git a/src/w32.c b/src/w32.c
|
|||
index 31ffa301c2f..f531274ce92 100644
|
|||
--- a/src/w32.c
|
|||
+++ b/src/w32.c
|
|||
@@ -7783,10 +7783,6 @@ init_winsock (int load_now)
|
|||
if (winsock_lib != NULL) |
|||
return TRUE; |
|||
|
|||
- pfn_SetHandleInformation
|
|||
- = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"),
|
|||
- "SetHandleInformation");
|
|||
-
|
|||
winsock_lib = LoadLibrary ("Ws2_32.dll"); |
|||
|
|||
if (winsock_lib != NULL) |
|||
@@ -10471,6 +10467,10 @@ init_ntproc (int dumping)
|
|||
Conveniently, init_environment is called before us, so |
|||
PRELOAD_WINSOCK can be set in the registry. */ |
|||
|
|||
+ pfn_SetHandleInformation
|
|||
+ = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"),
|
|||
+ "SetHandleInformation");
|
|||
+
|
|||
/* Always initialize this correctly. */ |
|||
winsock_lib = NULL; |
|||
|
|||
@@ -10480,60 +10480,73 @@ init_ntproc (int dumping)
|
|||
/* Initial preparation for subprocess support: replace our standard |
|||
handles with non-inheritable versions. */ |
|||
{ |
|||
- HANDLE parent;
|
|||
- HANDLE stdin_save = INVALID_HANDLE_VALUE;
|
|||
- HANDLE stdout_save = INVALID_HANDLE_VALUE;
|
|||
- HANDLE stderr_save = INVALID_HANDLE_VALUE;
|
|||
-
|
|||
- parent = GetCurrentProcess ();
|
|||
-
|
|||
- /* ignore errors when duplicating and closing; typically the
|
|||
- handles will be invalid when running as a gui program. */
|
|||
- DuplicateHandle (parent,
|
|||
- GetStdHandle (STD_INPUT_HANDLE),
|
|||
- parent,
|
|||
- &stdin_save,
|
|||
- 0,
|
|||
- FALSE,
|
|||
- DUPLICATE_SAME_ACCESS);
|
|||
-
|
|||
- DuplicateHandle (parent,
|
|||
- GetStdHandle (STD_OUTPUT_HANDLE),
|
|||
- parent,
|
|||
- &stdout_save,
|
|||
- 0,
|
|||
- FALSE,
|
|||
- DUPLICATE_SAME_ACCESS);
|
|||
-
|
|||
- DuplicateHandle (parent,
|
|||
- GetStdHandle (STD_ERROR_HANDLE),
|
|||
- parent,
|
|||
- &stderr_save,
|
|||
- 0,
|
|||
- FALSE,
|
|||
- DUPLICATE_SAME_ACCESS);
|
|||
-
|
|||
- fclose (stdin);
|
|||
- fclose (stdout);
|
|||
- fclose (stderr);
|
|||
-
|
|||
- if (stdin_save != INVALID_HANDLE_VALUE)
|
|||
- _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
|
|||
+ /* For UCRT, the _fdopen will try to find free stream from
|
|||
+ _IOB_ENTRIES (= 3), thus we can't reopen the standard handles
|
|||
+ with it. Using SetHandleInformation to make the handle not
|
|||
+ inheritable to child process is a better way. */
|
|||
+ if (pfn_SetHandleInformation)
|
|||
+ {
|
|||
+ pfn_SetHandleInformation (GetStdHandle(STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
|
|||
+ pfn_SetHandleInformation (GetStdHandle(STD_OUTPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
|
|||
+ pfn_SetHandleInformation (GetStdHandle(STD_ERROR_HANDLE), HANDLE_FLAG_INHERIT, 0);
|
|||
+ }
|
|||
else |
|||
- _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
|
|||
- _fdopen (0, "r");
|
|||
+ {
|
|||
+ HANDLE parent;
|
|||
+ HANDLE stdin_save = INVALID_HANDLE_VALUE;
|
|||
+ HANDLE stdout_save = INVALID_HANDLE_VALUE;
|
|||
+ HANDLE stderr_save = INVALID_HANDLE_VALUE;
|
|||
+
|
|||
+ parent = GetCurrentProcess ();
|
|||
+
|
|||
+ /* ignore errors when duplicating and closing; typically the
|
|||
+ handles will be invalid when running as a gui program. */
|
|||
+ DuplicateHandle (parent,
|
|||
+ GetStdHandle (STD_INPUT_HANDLE),
|
|||
+ parent,
|
|||
+ &stdin_save,
|
|||
+ 0,
|
|||
+ FALSE,
|
|||
+ DUPLICATE_SAME_ACCESS);
|
|||
+
|
|||
+ DuplicateHandle (parent,
|
|||
+ GetStdHandle (STD_OUTPUT_HANDLE),
|
|||
+ parent,
|
|||
+ &stdout_save,
|
|||
+ 0,
|
|||
+ FALSE,
|
|||
+ DUPLICATE_SAME_ACCESS);
|
|||
+
|
|||
+ DuplicateHandle (parent,
|
|||
+ GetStdHandle (STD_ERROR_HANDLE),
|
|||
+ parent,
|
|||
+ &stderr_save,
|
|||
+ 0,
|
|||
+ FALSE,
|
|||
+ DUPLICATE_SAME_ACCESS);
|
|||
+
|
|||
+ fclose (stdin);
|
|||
+ fclose (stdout);
|
|||
+ fclose (stderr);
|
|||
+
|
|||
+ if (stdin_save != INVALID_HANDLE_VALUE)
|
|||
+ _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
|
|||
+ else
|
|||
+ _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
|
|||
+ _fdopen (0, "r");
|
|||
|
|||
- if (stdout_save != INVALID_HANDLE_VALUE)
|
|||
- _open_osfhandle ((intptr_t) stdout_save, O_TEXT);
|
|||
- else
|
|||
- _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
|
|||
- _fdopen (1, "w");
|
|||
+ if (stdout_save != INVALID_HANDLE_VALUE)
|
|||
+ _open_osfhandle ((intptr_t) stdout_save, O_TEXT);
|
|||
+ else
|
|||
+ _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
|
|||
+ _fdopen (1, "w");
|
|||
|
|||
- if (stderr_save != INVALID_HANDLE_VALUE)
|
|||
- _open_osfhandle ((intptr_t) stderr_save, O_TEXT);
|
|||
- else
|
|||
- _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
|
|||
- _fdopen (2, "w");
|
|||
+ if (stderr_save != INVALID_HANDLE_VALUE)
|
|||
+ _open_osfhandle ((intptr_t) stderr_save, O_TEXT);
|
|||
+ else
|
|||
+ _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
|
|||
+ _fdopen (2, "w");
|
|||
+ }
|
|||
} |
|||
|
|||
/* unfortunately, atexit depends on implementation of malloc */ |
|||
--
|
|||
2.46.0.windows.1 |
|||
|
Loading…
Reference in new issue