]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.24] runtime: use WCLONE when waiting on pidfd test child
authorMichael Pratt <mpratt@google.com>
Fri, 21 Feb 2025 15:29:09 +0000 (10:29 -0500)
committerMichael Pratt <mpratt@google.com>
Wed, 26 Feb 2025 17:45:51 +0000 (09:45 -0800)
As of CL 650835, the pidfd test child no longer sends SIGCHLD on exit.
Per clone(2), "If [the child termination] signal is specified as
anything other than SIGCHLD, then the parent process must specify the
__WALL or __WCLONE options when waiting for the child with wait(2)."

Align with this requirement.

For #71849.
For #71828.

Change-Id: I6a6a636c739e4a59abe1533fe429a433e8588939
Reviewed-on: https://go-review.googlesource.com/c/go/+/651415
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit e1e65ae3ee5f977c31f3651233cc7ff2a0b579ca)
Reviewed-on: https://go-review.googlesource.com/c/go/+/651476

src/syscall/exec_linux.go

index 7730bc649633c2664ad5d1bcd37aa4c01787edda..98151d34ac5578b271e63e2e66b38b0998dcf76b 100644 (file)
@@ -779,7 +779,12 @@ func os_checkClonePidfd() error {
                var err error
                for {
                        var status WaitStatus
-                       _, err = Wait4(int(pid), &status, 0, nil)
+                       // WCLONE is an untyped constant that sets bit 31, so
+                       // it cannot convert directly to int on 32-bit
+                       // GOARCHes. We must convert through another type
+                       // first.
+                       flags := uint(WCLONE)
+                       _, err = Wait4(int(pid), &status, int(flags), nil)
                        if err != EINTR {
                                break
                        }
@@ -797,7 +802,7 @@ func os_checkClonePidfd() error {
 
        for {
                const _P_PIDFD = 3
-               _, _, errno = Syscall6(SYS_WAITID, _P_PIDFD, uintptr(pidfd), 0, WEXITED, 0, 0)
+               _, _, errno = Syscall6(SYS_WAITID, _P_PIDFD, uintptr(pidfd), 0, WEXITED | WCLONE, 0, 0)
                if errno != EINTR {
                        break
                }