diff options
Diffstat (limited to '')
-rw-r--r-- | go-patches/0006-syscall-introduce-SysProcAttr.ParentProcess-on-Windo.patch | 171 |
1 files changed, 0 insertions, 171 deletions
diff --git a/go-patches/0006-syscall-introduce-SysProcAttr.ParentProcess-on-Windo.patch b/go-patches/0006-syscall-introduce-SysProcAttr.ParentProcess-on-Windo.patch deleted file mode 100644 index b7453be0..00000000 --- a/go-patches/0006-syscall-introduce-SysProcAttr.ParentProcess-on-Windo.patch +++ /dev/null @@ -1,171 +0,0 @@ -From fd146509dda08eca30b2145deddb669b789da6e0 Mon Sep 17 00:00:00 2001 -From: "Jason A. Donenfeld" <Jason@zx2c4.com> -Date: Sun, 31 Jan 2021 18:14:56 +0100 -Subject: [PATCH 6/6] syscall: introduce SysProcAttr.ParentProcess on Windows - -This allows users to specify which process should be used as the parent -process when creating a new process. - -Note that this doesn't just trivially pass the handle onward to -PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, because inherited handles must be -valid in the parent process, so if we're changing the destination -process, then we must also change the origin of the parent handles. And, -the StartProcess function must clean up these handles successfully when -exiting, regardless of where the duplication happened. So, we take care -in this commit to use DuplicateHandle for both duplicating and for -closing the inherited handles. - -The test was taken originally from CL 288272 and adjusted for use here. - -Fixes #44011. - -Change-Id: Ib3b132028dcab1aded3dc0e65126c8abebfa35eb ---- - src/syscall/exec_windows.go | 17 ++++++-- - src/syscall/exec_windows_test.go | 73 ++++++++++++++++++++++++++++++++ - 2 files changed, 87 insertions(+), 3 deletions(-) - -diff --git a/src/syscall/exec_windows.go b/src/syscall/exec_windows.go -index 958b11260f..89257be0a4 100644 ---- a/src/syscall/exec_windows.go -+++ b/src/syscall/exec_windows.go -@@ -243,6 +243,7 @@ type SysProcAttr struct { - 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 -+ ParentProcess Handle // if non-zero, the new process regards the process given by this handle as its parent process - } - - var zeroProcAttr ProcAttr -@@ -312,18 +313,22 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle - } - - p, _ := GetCurrentProcess() -+ parentProcess := p -+ if sys.ParentProcess != 0 { -+ parentProcess = sys.ParentProcess -+ } - fd := make([]Handle, len(attr.Files)) - for i := range attr.Files { - if attr.Files[i] > 0 { -- err := DuplicateHandle(p, Handle(attr.Files[i]), p, &fd[i], 0, true, DUPLICATE_SAME_ACCESS) -+ err := DuplicateHandle(p, Handle(attr.Files[i]), parentProcess, &fd[i], 0, true, DUPLICATE_SAME_ACCESS) - if err != nil { - return 0, 0, err - } -- defer CloseHandle(Handle(fd[i])) -+ defer DuplicateHandle(parentProcess, fd[i], 0, nil, 0, false, DUPLICATE_CLOSE_SOURCE) - } - } - si := new(_STARTUPINFOEXW) -- si.ProcThreadAttributeList, err = newProcThreadAttributeList(1) -+ si.ProcThreadAttributeList, err = newProcThreadAttributeList(2) - if err != nil { - return 0, 0, err - } -@@ -333,6 +338,12 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle - si.Flags |= STARTF_USESHOWWINDOW - si.ShowWindow = SW_HIDE - } -+ if sys.ParentProcess != 0 { -+ err = si.ProcThreadAttributeList.Add(_PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, unsafe.Pointer(&sys.ParentProcess), unsafe.Sizeof(sys.ParentProcess)) -+ if err != nil { -+ return 0, 0, err -+ } -+ } - si.StdInput = fd[0] - si.StdOutput = fd[1] - si.StdErr = fd[2] -diff --git a/src/syscall/exec_windows_test.go b/src/syscall/exec_windows_test.go -index eda1d36877..8a1c2ceaae 100644 ---- a/src/syscall/exec_windows_test.go -+++ b/src/syscall/exec_windows_test.go -@@ -5,8 +5,14 @@ - package syscall_test - - import ( -+ "fmt" -+ "io/ioutil" -+ "os" -+ "os/exec" -+ "path/filepath" - "syscall" - "testing" -+ "time" - ) - - func TestEscapeArg(t *testing.T) { -@@ -41,3 +47,70 @@ func TestEscapeArg(t *testing.T) { - } - } - } -+ -+func TestChangingProcessParent(t *testing.T) { -+ if os.Getenv("GO_WANT_HELPER_PROCESS") == "parent" { -+ // in parent process -+ -+ // Parent does nothign. It is just used as a parent of a child process. -+ time.Sleep(time.Minute) -+ os.Exit(0) -+ } -+ -+ if os.Getenv("GO_WANT_HELPER_PROCESS") == "child" { -+ // in child process -+ dumpPath := os.Getenv("GO_WANT_HELPER_PROCESS_FILE") -+ if dumpPath == "" { -+ fmt.Fprintf(os.Stderr, "Dump file path cannot be blank.") -+ os.Exit(1) -+ } -+ err := os.WriteFile(dumpPath, []byte(fmt.Sprintf("%d", os.Getppid())), 0644) -+ if err != nil { -+ fmt.Fprintf(os.Stderr, "Error writing dump file: %v", err) -+ os.Exit(2) -+ } -+ os.Exit(0) -+ } -+ -+ // run parent process -+ -+ parent := exec.Command(os.Args[0], "-test.run=TestChangingProcessParent") -+ parent.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=parent") -+ err := parent.Start() -+ if err != nil { -+ t.Fatal(err) -+ } -+ defer func() { -+ parent.Process.Kill() -+ parent.Wait() -+ }() -+ -+ // run child process -+ -+ const _PROCESS_CREATE_PROCESS = 0x0080 -+ const _PROCESS_DUP_HANDLE = 0x0040 -+ childDumpPath := filepath.Join(t.TempDir(), "ppid.txt") -+ ph, err := syscall.OpenProcess(_PROCESS_CREATE_PROCESS|_PROCESS_DUP_HANDLE|syscall.PROCESS_QUERY_INFORMATION, -+ false, uint32(parent.Process.Pid)) -+ if err != nil { -+ t.Fatal(err) -+ } -+ defer syscall.CloseHandle(ph) -+ -+ child := exec.Command(os.Args[0], "-test.run=TestChangingProcessParent") -+ child.Env = append(os.Environ(), -+ "GO_WANT_HELPER_PROCESS=child", -+ "GO_WANT_HELPER_PROCESS_FILE="+childDumpPath) -+ child.SysProcAttr = &syscall.SysProcAttr{ParentProcess: ph} -+ childOutput, err := child.CombinedOutput() -+ if err != nil { -+ t.Errorf("child failed: %v: %v", err, string(childOutput)) -+ } -+ childOutput, err = ioutil.ReadFile(childDumpPath) -+ if err != nil { -+ t.Fatalf("reading child ouput failed: %v", err) -+ } -+ if got, want := string(childOutput), fmt.Sprintf("%d", parent.Process.Pid); got != want { -+ t.Fatalf("child output: want %q, got %q", want, got) -+ } -+} --- -2.30.0 - |