]> git.eshelyaron.com Git - emacs.git/commitdiff
Use SetHandleInformation to set NOINHERIT in UCRT64
authorKien Nguyen <kien.n.quang@gmail.com>
Wed, 7 Aug 2024 17:39:38 +0000 (10:39 -0700)
committerEshel Yaron <me@eshelyaron.com>
Sun, 11 Aug 2024 07:31:31 +0000 (09:31 +0200)
* src/w32.c (init_ntproc) [_UCRT]: Use SetHandleInformation to
prevent standard handles from being inherited, instead of relying
on MSVCRT-only behavior.  For the details of the problem, see
https://lists.gnu.org/archive/html/emacs-devel/2024-07/msg01129.html.

Copyright-paperwork-exempt: yes
(cherry picked from commit de7de561e1e3a973581b6993b3cc0074ff0bf91c)

src/w32.c

index 31ffa301c2f55958aeca7ddc2b1f68de476fd70b..0c1291f10943cdf40cf28cb233f0a001bf8236a6 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -10480,6 +10480,16 @@ init_ntproc (int dumping)
   /* Initial preparation for subprocess support: replace our standard
      handles with non-inheritable versions. */
   {
+
+#ifdef _UCRT
+    /* 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. */
+    SetHandleInformation (GetStdHandle(STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
+    SetHandleInformation (GetStdHandle(STD_OUTPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
+    SetHandleInformation (GetStdHandle(STD_ERROR_HANDLE), HANDLE_FLAG_INHERIT, 0);
+#else
     HANDLE parent;
     HANDLE stdin_save =  INVALID_HANDLE_VALUE;
     HANDLE stdout_save = INVALID_HANDLE_VALUE;
@@ -10534,6 +10544,7 @@ init_ntproc (int dumping)
     else
       _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
     _fdopen (2, "w");
+#endif
   }
 
   /* unfortunately, atexit depends on implementation of malloc */