aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2025-02-21 10:29:09 -0500
committerMichael Pratt <mpratt@google.com>2025-02-26 09:45:51 -0800
commitbecc17ebcd841da12d4d17fac77312085e244cde (patch)
tree3c2a12b76a98a8f7c06b5ebbb710bb20a8491a02
parentd418e224ae3bc44c5a3c66a4955832e64179e16b (diff)
downloadgo-becc17ebcd841da12d4d17fac77312085e244cde.tar.xz
[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 <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
-rw-r--r--src/syscall/exec_linux.go9
1 files changed, 7 insertions, 2 deletions
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
}