From: Michael Pratt Date: Fri, 21 Feb 2025 15:29:09 +0000 (-0500) Subject: [release-branch.go1.24] runtime: use WCLONE when waiting on pidfd test child X-Git-Tag: go1.24.1~9 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=becc17ebcd841da12d4d17fac77312085e244cde;p=gostls13.git [release-branch.go1.24] runtime: use WCLONE when waiting on pidfd test child 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 Auto-Submit: Michael Pratt Reviewed-by: Ian Lance Taylor LUCI-TryBot-Result: Go LUCI (cherry picked from commit e1e65ae3ee5f977c31f3651233cc7ff2a0b579ca) Reviewed-on: https://go-review.googlesource.com/c/go/+/651476 --- diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index 7730bc6496..98151d34ac 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -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 }