]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: disable ptrace on iOS
authorElias Naur <mail@eliasnaur.com>
Thu, 13 Jun 2019 21:40:00 +0000 (23:40 +0200)
committerElias Naur <mail@eliasnaur.com>
Sat, 15 Jun 2019 14:23:04 +0000 (14:23 +0000)
It is forbidden by App Store.

Fixes #31628

Change-Id: Ie6d14a524ee55b57af8db685f3a79f474733add5
Reviewed-on: https://go-review.googlesource.com/c/go/+/182297
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
16 files changed:
src/syscall/exec_darwin.go
src/syscall/mksyscall.pl
src/syscall/syscall_darwin.go
src/syscall/syscall_darwin_386.go
src/syscall/syscall_darwin_amd64.go
src/syscall/syscall_darwin_arm.go
src/syscall/syscall_darwin_arm64.go
src/syscall/syscall_ptrace_test.go [new file with mode: 0644]
src/syscall/zsyscall_darwin_386.go
src/syscall/zsyscall_darwin_386.s
src/syscall/zsyscall_darwin_amd64.go
src/syscall/zsyscall_darwin_amd64.s
src/syscall/zsyscall_darwin_arm.go
src/syscall/zsyscall_darwin_arm.s
src/syscall/zsyscall_darwin_arm64.go
src/syscall/zsyscall_darwin_arm64.s

index a7af3afe94397d79b23a8d2070f86cc81b6c8903..9f7bf67d2c3c541d2b237fcf3bdcf7a55976c509 100644 (file)
@@ -80,8 +80,8 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
 
        // Enable tracing if requested.
        if sys.Ptrace {
-               _, _, err1 = rawSyscall(funcPC(libc_ptrace_trampoline), uintptr(PTRACE_TRACEME), 0, 0)
-               if err1 != 0 {
+               if err := ptrace(PTRACE_TRACEME, 0, 0, 0); err != nil {
+                       err1 = err.(Errno)
                        goto childerror
                }
        }
index 667ca54c02f685c89b7c90f575e4b361dd558116..2a82145a62acac729ccc254b3d2ee7b2d1e286ce 100755 (executable)
@@ -130,6 +130,12 @@ while(<>) {
        # without reading the header.
        $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n";
 
+       if ($darwin && $func eq "ptrace") {
+               # The ptrace function is called from forkAndExecInChild where stack
+               # growth is forbidden.
+               $text .= "//go:nosplit\n"
+       }
+
        # Go function header.
        my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : "";
        $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl;
index e7a0967d362d7834541b308960210139140777c6..7d795ee4d3dda7a7411d00d9d5174bbbdc4b2720 100644 (file)
@@ -87,7 +87,6 @@ func direntNamlen(buf []byte) (uint64, bool) {
        return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 }
 
-//sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
 
index a8926c022a57da0f1d2e3333acc8e58d6c4fb419..8c5b82da55d63afe291f9790b16a40fea72e0c54 100644 (file)
@@ -21,6 +21,7 @@ func setTimeval(sec, usec int64) Timeval {
 //sys  Stat(path string, stat *Stat_t) (err error) = SYS_stat64
 //sys  Statfs(path string, stat *Statfs_t) (err error) = SYS_statfs64
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_fstatat64
+//sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
 
 func SetKevent(k *Kevent_t, fd, mode, flags int) {
        k.Ident = uint32(fd)
index bc3acf8d7589ff266d9dd44708d7aeda889da38e..23a4e5f9962634ecb13d1abb21753ee9dea7dcb3 100644 (file)
@@ -21,6 +21,7 @@ func setTimeval(sec, usec int64) Timeval {
 //sys  Stat(path string, stat *Stat_t) (err error) = SYS_stat64
 //sys  Statfs(path string, stat *Statfs_t) (err error) = SYS_statfs64
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_fstatat64
+//sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
 
 func SetKevent(k *Kevent_t, fd, mode, flags int) {
        k.Ident = uint64(fd)
index 19c9827c093ac95ce523adb6f08769276af6e86b..7f39cf4003182e44da2b8973df8946372af8b9a1 100644 (file)
@@ -22,6 +22,13 @@ func setTimeval(sec, usec int64) Timeval {
 //sys  Statfs(path string, stat *Statfs_t) (err error)
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 
+// Marked nosplit because it is called from forkAndExecInChild where
+// stack growth is forbidden.
+//go:nosplit
+func ptrace(request int, pid int, addr uintptr, data uintptr) error {
+       return ENOTSUP
+}
+
 func SetKevent(k *Kevent_t, fd, mode, flags int) {
        k.Ident = uint32(fd)
        k.Filter = int16(mode)
index 95eb9465b9bd691d89fefcdc340bc7d0fb48386f..bd110f2e7f2ebde35e2c45a5d7f5e158a41ce791 100644 (file)
@@ -22,6 +22,13 @@ func setTimeval(sec, usec int64) Timeval {
 //sys  Statfs(path string, stat *Statfs_t) (err error)
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 
+// Marked nosplit because it is called from forkAndExecInChild where
+// stack growth is forbidden.
+//go:nosplit
+func ptrace(request int, pid int, addr uintptr, data uintptr) error {
+       return ENOTSUP
+}
+
 func SetKevent(k *Kevent_t, fd, mode, flags int) {
        k.Ident = uint64(fd)
        k.Filter = int16(mode)
diff --git a/src/syscall/syscall_ptrace_test.go b/src/syscall/syscall_ptrace_test.go
new file mode 100644 (file)
index 0000000..dd1f084
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd
+
+package syscall_test
+
+import (
+       "internal/testenv"
+       "os"
+       "os/exec"
+       "syscall"
+       "testing"
+)
+
+func TestExecPtrace(t *testing.T) {
+       testenv.MustHaveExec(t)
+
+       bin, err := exec.LookPath("sh")
+       if err != nil {
+               t.Skipf("skipped because sh is not available")
+       }
+
+       attr := &os.ProcAttr{
+               Sys: &syscall.SysProcAttr{
+                       Ptrace: true,
+               },
+       }
+       proc, err := os.StartProcess(bin, []string{bin}, attr)
+       if err != nil {
+               t.Fatalf("StartProcess with ptrace enabled failed: %v", err)
+       }
+       proc.Kill()
+}
index 06a51557e685baed52c397a859b11f65400aab8b..2c3b15f5f94d2645d2f48d29db07d6d2310824fa 100644 (file)
@@ -350,21 +350,6 @@ func libc_fcntl_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
-       _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_ptrace_trampoline()
-
-//go:linkname libc_ptrace libc_ptrace
-//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func pipe(p *[2]int32) (err error) {
        _, _, e1 := rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
@@ -2080,3 +2065,19 @@ func libc_fstatat64_trampoline()
 
 //go:linkname libc_fstatat64 libc_fstatat64
 //go:cgo_import_dynamic libc_fstatat64 fstatat64 "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+//go:nosplit
+func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
+       _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_ptrace_trampoline()
+
+//go:linkname libc_ptrace libc_ptrace
+//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
index a50c3ef4df3633027cd5069b1333fbae58604eea..d84b46229e11d3ec38a204852146d9a629ace0a3 100644 (file)
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_futimes(SB)
 TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fcntl(SB)
-TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_ptrace(SB)
 TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_pipe(SB)
 TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0
@@ -251,3 +249,5 @@ TEXT ·libc_statfs64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_statfs64(SB)
 TEXT ·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat64(SB)
+TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_ptrace(SB)
index c2b88fc4c42a1fc22bc210aca0799b4bd84b3b5d..83214de2fbb0fab7690655e2cea3ae0deda4bc70 100644 (file)
@@ -350,21 +350,6 @@ func libc_fcntl_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
-       _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_ptrace_trampoline()
-
-//go:linkname libc_ptrace libc_ptrace
-//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func pipe(p *[2]int32) (err error) {
        _, _, e1 := rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
@@ -2080,3 +2065,19 @@ func libc_fstatat64_trampoline()
 
 //go:linkname libc_fstatat64 libc_fstatat64
 //go:cgo_import_dynamic libc_fstatat64 fstatat64 "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+//go:nosplit
+func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
+       _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_ptrace_trampoline()
+
+//go:linkname libc_ptrace libc_ptrace
+//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
index 626cd752dbae7b1d4b539fbc1b8d9c160be39457..23ddbe06c0dfff9aa0677e6c74a0931ff33a23f2 100644 (file)
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_futimes(SB)
 TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fcntl(SB)
-TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_ptrace(SB)
 TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_pipe(SB)
 TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0
@@ -251,3 +249,5 @@ TEXT ·libc_statfs64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_statfs64(SB)
 TEXT ·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat64(SB)
+TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_ptrace(SB)
index a640c7425add3cfafb9b6228eaab845a34b2db6e..2a643f209fd18349b5469dce9c0203b5383bfb39 100644 (file)
@@ -350,21 +350,6 @@ func libc_fcntl_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
-       _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_ptrace_trampoline()
-
-//go:linkname libc_ptrace libc_ptrace
-//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func pipe(p *[2]int32) (err error) {
        _, _, e1 := rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
index 09634132660dfbfd5a7ca742a342897c5674e43a..c7cd83d83ea9110a00466f82bb111405cfc3a479 100644 (file)
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_futimes(SB)
 TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fcntl(SB)
-TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_ptrace(SB)
 TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_pipe(SB)
 TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0
index e6d362d3a49031ea9264662a4e8900a40551f323..0b7783986925670bb10dacbb564c6b73f03c763b 100644 (file)
@@ -350,21 +350,6 @@ func libc_fcntl_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
-       _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_ptrace_trampoline()
-
-//go:linkname libc_ptrace libc_ptrace
-//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func pipe(p *[2]int32) (err error) {
        _, _, e1 := rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
index 23ddc8f53ca5b176034e98f3cbb29c8f493133b8..7b8b3764a82ac0b0fd4e196c5b1af83a184a2f0a 100644 (file)
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_futimes(SB)
 TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fcntl(SB)
-TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_ptrace(SB)
 TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_pipe(SB)
 TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0