]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.19] runtime: revert "call __fork instead of fork on darwin"
authorRuss Cox <rsc@golang.org>
Sun, 8 Jan 2023 22:30:01 +0000 (17:30 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 9 Jan 2023 17:35:28 +0000 (17:35 +0000)
A recent comment on #57263 reports an unexplained crash in a cgo program
that is fixed by reverting the __fork fix. We don't have any viable fix for the
os/exec bug at this point, so give up on a fix for the January point releases.

This reverts CL 459178 (commit 91bc4cd118dd).

Fixes #57690.

Change-Id: Ieb38d9bc7f967e9a726429eab2ea515d5ca0847f
Reviewed-on: https://go-review.googlesource.com/c/go/+/461115
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/syscall/exec_libc2.go
src/syscall/syscall_darwin.go
src/syscall/syscall_openbsd_libc.go
src/syscall/zsyscall_darwin_amd64.go
src/syscall/zsyscall_darwin_amd64.s
src/syscall/zsyscall_darwin_arm64.go
src/syscall/zsyscall_darwin_arm64.s

index f4be784a82c7e08a524630d8a277e9c11adcefde..9eb61a5d35168dac5db6e2cba83a4713a6439a1f 100644 (file)
@@ -78,7 +78,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
        // About to call fork.
        // No more allocation or calls of non-assembly functions.
        runtime_BeforeFork()
-       r1, _, err1 = rawSyscall(forkTrampoline, 0, 0, 0)
+       r1, _, err1 = rawSyscall(abi.FuncPCABI0(libc_fork_trampoline), 0, 0, 0)
        if err1 != 0 {
                runtime_AfterFork()
                return 0, err1
@@ -276,6 +276,6 @@ childerror:
        // send error code on pipe
        rawSyscall(abi.FuncPCABI0(libc_write_trampoline), uintptr(pipe), uintptr(unsafe.Pointer(&err1)), unsafe.Sizeof(err1))
        for {
-               rawSyscall(exitTrampoline, 253, 0, 0)
+               rawSyscall(abi.FuncPCABI0(libc_exit_trampoline), 253, 0, 0)
        }
 }
index b0d89d036bacc039ab5ee07e97464edf43d8f86e..663bd98c104f517dba0a351b268dcdcac4907299 100644 (file)
@@ -22,34 +22,7 @@ func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
 func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
 func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
 
-// These are called from exec_libc2.go in the child of fork.
-// The names differ between macOS and OpenBSD, so we need
-// to declare the specific ones used here to keep the exec_libc2.go
-// code portable.
-//
-// We use __fork and __exit, not fork and exit, to avoid the libc atfork
-// and atexit handlers. The atfork handlers have caused fork child
-// hangs in the past (see #33565, #56784). The atexit handlers have
-// not, but the non-libc ports all invoke the system call, so doing
-// the same here makes sense. In general we wouldn't expect
-// atexit handlers to work terribly well in a fork child anyway.
-// (Also, perhaps the atfork handlers clear the atexit handlers,
-// in which case we definitely need to avoid calling the libc exit
-// if we bypass the libc fork.)
-//
-// Other calls that are made in the child after the fork are
-// ptrace, setsid, setpgid, getpid, ioctl, chroot, setgroups,
-// setgid, setuid, chdir, dup2, fcntl, close, execve, and write.
-// Those are all simple kernel wrappers that should be safe
-// to be called directly. The fcntl and ioctl functions do run
-// some code around the kernel call, but they don't call any
-// other functions, so for now we keep using them instead of
-// calling the lower-level __fcntl and __ioctl functions.
-var (
-       dupTrampoline  = abi.FuncPCABI0(libc_dup2_trampoline)
-       exitTrampoline = abi.FuncPCABI0(libc___exit_trampoline)
-       forkTrampoline = abi.FuncPCABI0(libc___fork_trampoline)
-)
+var dupTrampoline = abi.FuncPCABI0(libc_dup2_trampoline)
 
 type SockaddrDatalink struct {
        Len    uint8
@@ -236,12 +209,11 @@ func Kill(pid int, signum Signal) (err error) { return kill(pid, int(signum), 1)
 //sys  writev(fd int, iovecs []Iovec) (cnt uintptr, err error)
 //sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
 //sys   munmap(addr uintptr, length uintptr) (err error)
-//sysnb __fork() (pid int, err error)
+//sysnb fork() (pid int, err error)
 //sysnb ioctl(fd int, req int, arg int) (err error)
 //sysnb ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_ioctl
 //sysnb execve(path *byte, argv **byte, envp **byte) (err error)
 //sysnb exit(res int) (err error)
-//sysnb __exit(res int) (err error)
 //sys  sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error)
 //sys  fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) = SYS_fcntl
 //sys   unlinkat(fd int, path string, flags int) (err error)
index 6358a9a390a0c3298946e6e6bc139adc5a21317c..516d02975c530a3ea1aea3b826039f7891797c80 100644 (file)
@@ -10,11 +10,7 @@ import (
        "internal/abi"
 )
 
-var (
-       dupTrampoline  = abi.FuncPCABI0(libc_dup3_trampoline)
-       exitTrampoline = abi.FuncPCABI0(libc_exit_trampoline)
-       forkTrampoline = abi.FuncPCABI0(libc_fork_trampoline)
-)
+var dupTrampoline = abi.FuncPCABI0(libc_dup3_trampoline)
 
 func init() {
        execveOpenBSD = execve
index fcb038e97abef60ca597721289e7ceb0bf6197e4..ee78a572fcbebbdff0030238130251b5df1378e4 100644 (file)
@@ -1714,8 +1714,8 @@ func libc_munmap_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func __fork() (pid int, err error) {
-       r0, _, e1 := rawSyscall(abi.FuncPCABI0(libc___fork_trampoline), 0, 0, 0)
+func fork() (pid int, err error) {
+       r0, _, e1 := rawSyscall(abi.FuncPCABI0(libc_fork_trampoline), 0, 0, 0)
        pid = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
@@ -1723,9 +1723,9 @@ func __fork() (pid int, err error) {
        return
 }
 
-func libc___fork_trampoline()
+func libc_fork_trampoline()
 
-//go:cgo_import_dynamic libc___fork __fork "/usr/lib/libSystem.B.dylib"
+//go:cgo_import_dynamic libc_fork fork "/usr/lib/libSystem.B.dylib"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
@@ -1781,20 +1781,6 @@ func libc_exit_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func __exit(res int) (err error) {
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc___exit_trampoline), uintptr(res), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc___exit_trampoline()
-
-//go:cgo_import_dynamic libc___exit __exit "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
        var _p0 unsafe.Pointer
        if len(mib) > 0 {
index 1815703803d1c71378ddca834e0b5c3300d3116c..563083d441a17c7600c4265e4104adc9498bc60b 100644 (file)
@@ -219,16 +219,14 @@ TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_mmap(SB)
 TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_munmap(SB)
-TEXT ·libc___fork_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___fork(SB)
+TEXT ·libc_fork_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_fork(SB)
 TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ioctl(SB)
 TEXT ·libc_execve_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_execve(SB)
 TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
-TEXT ·libc___exit_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___exit(SB)
 TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_sysctl(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
index a4bdcee637a271f8188b68717877689a64286cc7..ac1eccf755978cd6446b0bc754dabd723528760b 100644 (file)
@@ -1714,8 +1714,8 @@ func libc_munmap_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func __fork() (pid int, err error) {
-       r0, _, e1 := rawSyscall(abi.FuncPCABI0(libc___fork_trampoline), 0, 0, 0)
+func fork() (pid int, err error) {
+       r0, _, e1 := rawSyscall(abi.FuncPCABI0(libc_fork_trampoline), 0, 0, 0)
        pid = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
@@ -1723,9 +1723,9 @@ func __fork() (pid int, err error) {
        return
 }
 
-func libc___fork_trampoline()
+func libc_fork_trampoline()
 
-//go:cgo_import_dynamic libc___fork __fork "/usr/lib/libSystem.B.dylib"
+//go:cgo_import_dynamic libc_fork fork "/usr/lib/libSystem.B.dylib"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
@@ -1781,20 +1781,6 @@ func libc_exit_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func __exit(res int) (err error) {
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc___exit_trampoline), uintptr(res), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc___exit_trampoline()
-
-//go:cgo_import_dynamic libc___exit __exit "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
        var _p0 unsafe.Pointer
        if len(mib) > 0 {
index 1666cf985c35b0a185ff49e8e9c1ad6f04d8f5d2..0567a42fa337985c3b5d0115cf27299c9ebe04d4 100644 (file)
@@ -219,16 +219,14 @@ TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_mmap(SB)
 TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_munmap(SB)
-TEXT ·libc___fork_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___fork(SB)
+TEXT ·libc_fork_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_fork(SB)
 TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ioctl(SB)
 TEXT ·libc_execve_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_execve(SB)
 TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
-TEXT ·libc___exit_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___exit(SB)
 TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_sysctl(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0