]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: check recorded version of ppid instead of 1
authorDavid Crawshaw <crawshaw@golang.org>
Thu, 11 Dec 2014 15:25:32 +0000 (10:25 -0500)
committerDavid Crawshaw <crawshaw@golang.org>
Mon, 22 Dec 2014 21:21:10 +0000 (21:21 +0000)
Handles the case where the parent is pid 1 (common in docker
containers).

Attempted and failed to write a test for this.

Fixes #9263.

Change-Id: I5c6036446c99e66259a4fab1660b6a594f875020
Reviewed-on: https://go-review.googlesource.com/1372
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/syscall/exec_linux.go

index 042c20a46812feb1d88e0f928e7e61382480e64a..03dd5c53c494497b3d99c208298c0c25299ff83e 100644 (file)
@@ -58,6 +58,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                p      [2]int
        )
 
+       // Record parent PID so child can test if it has died.
+       ppid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+
        // Guard against side effects of shuffling fds below.
        // Make sure that nextfd is beyond any currently open files so
        // that we can't run the risk of overwriting any of them.
@@ -138,7 +141,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                // duplicate signal in rare cases, but it won't matter when
                // using SIGKILL.
                r1, _, _ = RawSyscall(SYS_GETPPID, 0, 0, 0)
-               if r1 == 1 {
+               if r1 != ppid {
                        pid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
                        _, _, err1 := RawSyscall(SYS_KILL, pid, uintptr(sys.Pdeathsig), 0)
                        if err1 != 0 {