]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: remove ptrace1 on darwin
authorCherry Mui <cherryyz@google.com>
Mon, 27 Nov 2023 20:17:11 +0000 (15:17 -0500)
committerCherry Mui <cherryyz@google.com>
Mon, 27 Nov 2023 21:34:30 +0000 (21:34 +0000)
On Darwin, the ptrace syscall is called in ptrace1, which then be
called in ptrace. This allows ptrace1 be disabled on iOS (by
implementing ptrace differently). But we can also achieve this by
adding a conditional directly in ptrace. This reduces stack usage
with -N -l, while keeping ptrace disabled on iOS.

For #64113.

Change-Id: I89d8e317e77352fffdbb5a25ba21ee9cdf2e1e20
Reviewed-on: https://go-review.googlesource.com/c/go/+/545276
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/syscall/mksyscall.pl
src/syscall/ptrace_darwin.go [deleted file]
src/syscall/ptrace_ios.go [deleted file]
src/syscall/syscall_darwin_amd64.go
src/syscall/syscall_darwin_arm64.go
src/syscall/zsyscall_darwin_amd64.go
src/syscall/zsyscall_darwin_arm64.go

index 73d4b0f6e368a0254bc8a418a861f2098ff474ee..47efbffcbcb113140c2c63b575df17822989a6e6 100755 (executable)
@@ -85,6 +85,9 @@ if($ARGV[0] =~ /^-/) {
 if($libc) {
        $extraimports = 'import "internal/abi"';
 }
+if($darwin) {
+       $extraimports .= "\nimport \"runtime\"";
+}
 
 sub parseparamlist($) {
        my ($list) = @_;
@@ -137,7 +140,7 @@ while(<>) {
        # without reading the header.
        $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n";
 
-       if (($darwin && $func =~ /^ptrace1(Ptr)?$/) || (($openbsd && $libc) && $func =~ /^ptrace(Ptr)?$/)) {
+       if ((($darwin || ($openbsd && $libc)) && $func =~ /^ptrace(Ptr)?$/)) {
                # The ptrace function is called from forkAndExecInChild where stack
                # growth is forbidden.
                $text .= "//go:nosplit\n"
@@ -147,6 +150,13 @@ while(<>) {
        my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : "";
        $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl;
 
+       # Disable ptrace on iOS.
+       if ($darwin && $func =~ /^ptrace(Ptr)?$/) {
+               $text .= "\tif runtime.GOOS == \"ios\" {\n";
+               $text .= "\t\tpanic(\"unimplemented\")\n";
+               $text .= "\t}\n";
+       }
+
        # Check if err return available
        my $errvar = "";
        foreach my $p (@out) {
diff --git a/src/syscall/ptrace_darwin.go b/src/syscall/ptrace_darwin.go
deleted file mode 100644 (file)
index 519e451..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2020 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.
-
-//go:build !ios
-
-package syscall
-
-// Nosplit because it is called from forkAndExecInChild.
-//
-//go:nosplit
-func ptrace(request int, pid int, addr uintptr, data uintptr) error {
-       return ptrace1(request, pid, addr, data)
-}
diff --git a/src/syscall/ptrace_ios.go b/src/syscall/ptrace_ios.go
deleted file mode 100644 (file)
index fa8d000..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2020 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.
-
-//go:build ios
-
-package syscall
-
-// Nosplit because it is called from forkAndExecInChild.
-//
-//go:nosplit
-func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
-       panic("unimplemented")
-}
index ef3c1998aada5b5d4a61dbc07b548a592aa12fae..64e54ad73081af0fd3396fe9b7e5cdad2f693031 100644 (file)
@@ -24,7 +24,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   ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
+//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 cea42772bbccf180514bfd26b2df1c6f22420efb..913c7483746864669b16a9d6005fdc8279d54d56 100644 (file)
@@ -24,7 +24,7 @@ func setTimeval(sec, usec int64) Timeval {
 //sys  Stat(path string, stat *Stat_t) (err error)
 //sys  Statfs(path string, stat *Statfs_t) (err error)
 //sys  fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
-//sys  ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
+//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 3ad9bad07650770b65027d6f9721b04c41836acb..8812fb12cd19c6694a25f26f01dbcd5934cc51cb 100644 (file)
@@ -7,6 +7,7 @@ package syscall
 
 import "unsafe"
 import "internal/abi"
+import "runtime"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
@@ -2011,7 +2012,10 @@ func libc_fstatat64_trampoline()
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 //go:nosplit
-func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) {
+func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
+       if runtime.GOOS == "ios" {
+               panic("unimplemented")
+       }
        _, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
                err = errnoErr(e1)
index c2502c7842bb27484a4db775edf65035ca76a97f..22b096349d47b9fd3b2054c3311413308565acfd 100644 (file)
@@ -7,6 +7,7 @@ package syscall
 
 import "unsafe"
 import "internal/abi"
+import "runtime"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
@@ -2011,7 +2012,10 @@ func libc_fstatat_trampoline()
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 //go:nosplit
-func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) {
+func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
+       if runtime.GOOS == "ios" {
+               panic("unimplemented")
+       }
        _, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
                err = errnoErr(e1)