]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: introduce SysProcAttr.AdditionalInheritedHandles on Windows
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 31 Jan 2021 17:07:43 +0000 (18:07 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 26 Feb 2021 18:23:47 +0000 (18:23 +0000)
This allows users to specify handles that they explicitly want to be
inherited by the new process. These handles must already be marked as
inheritable.

Updates #44011.
Updates #21085.

Change-Id: Ib18322e7dc2909e68c4209e80385492804fa15d3
Reviewed-on: https://go-review.googlesource.com/c/go/+/288298
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/syscall/exec_windows.go

index ff9f7a3913bf61ce0c4b9b72d724c9a27f443f38..0ddc240a563eaaabfca0e6375a049f3e77ffbd55 100644 (file)
@@ -235,13 +235,14 @@ type ProcAttr struct {
 }
 
 type SysProcAttr struct {
-       HideWindow        bool
-       CmdLine           string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
-       CreationFlags     uint32
-       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
+       HideWindow                 bool
+       CmdLine                    string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
+       CreationFlags              uint32
+       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
+       AdditionalInheritedHandles []Handle            // a list of additional handles, already marked as inheritable, that will be inherited by the new process
 }
 
 var zeroProcAttr ProcAttr
@@ -337,6 +338,7 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
        si.StdOutput = fd[1]
        si.StdErr = fd[2]
 
+       fd = append(fd, sys.AdditionalInheritedHandles...)
        // Do not accidentally inherit more than these handles.
        err = updateProcThreadAttribute(si.ProcThreadAttributeList, 0, _PROC_THREAD_ATTRIBUTE_HANDLE_LIST, uintptr(unsafe.Pointer(&fd[0])), uintptr(len(fd))*unsafe.Sizeof(fd[0]), 0, nil)
        if err != nil {