From 1e3b535b6eb7f13eb6d903f7998c384a36e9bba8 Mon Sep 17 00:00:00 2001 From: Johan Knutzen Date: Wed, 21 Oct 2020 18:45:03 +0000 Subject: [PATCH] syscall: expose bInheritHandles of CreateProcess Certain use cases require this parameter to be false. This includes spawning a child process in a different windows session than session 0. Docs regarding the behavior of this parameter to CreateProcess: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa Fixes #42098 Change-Id: If998f57d6f2962824aacbee75e1b508b255ab293 GitHub-Last-Rev: 584eb13e36a3ef7e0cd959295e92fb129f21d1f8 GitHub-Pull-Request: golang/go#41957 Reviewed-on: https://go-review.googlesource.com/c/go/+/261917 Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Tobias Klauser Trust: Alex Brainman --- doc/go1.16.html | 8 ++++++++ src/syscall/exec_windows.go | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 5d293078861..5ae85e6c293 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -378,6 +378,14 @@ Do not send CLs removing the interior tags from such phrases. +
syscall
+
+

+ SysProcAttr on Windows has a new NoInheritHandles field that disables inheriting handles when creating a new process. +

+
+
+
strconv

diff --git a/src/syscall/exec_windows.go b/src/syscall/exec_windows.go index 4a1d74ba3f3..46cbd7567dd 100644 --- a/src/syscall/exec_windows.go +++ b/src/syscall/exec_windows.go @@ -241,6 +241,7 @@ type SysProcAttr struct { Token Token // if set, runs new process in the security context represented by the token ProcessAttributes *SecurityAttributes // if set, applies these security attributes as the descriptor for the new process ThreadAttributes *SecurityAttributes // if set, applies these security attributes as the descriptor for the main thread of the new process + NoInheritHandles bool // if set, each inheritable handle in the calling process is not inherited by the new process } var zeroProcAttr ProcAttr @@ -341,9 +342,9 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle flags := sys.CreationFlags | CREATE_UNICODE_ENVIRONMENT if sys.Token != 0 { - err = CreateProcessAsUser(sys.Token, argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, true, flags, createEnvBlock(attr.Env), dirp, si, pi) + err = CreateProcessAsUser(sys.Token, argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, !sys.NoInheritHandles, flags, createEnvBlock(attr.Env), dirp, si, pi) } else { - err = CreateProcess(argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, true, flags, createEnvBlock(attr.Env), dirp, si, pi) + err = CreateProcess(argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, !sys.NoInheritHandles, flags, createEnvBlock(attr.Env), dirp, si, pi) } if err != nil { return 0, 0, err