Skip to content

Commit 4c5d6ed

Browse files
dmgkgopherbot
authored andcommitted
syscall: add ptracePtr that accepts pointer arg as unsafe.Pointer
The existing ptrace wrapper accepts pointer argument as an uintptr which often points to the memory allocated in Go. This violates unsafe.Pointer safety rules. Fixes #58387 Change-Id: Iab12122c495953f94ea00c2a61654a818a464205 Reviewed-on: https://go-review.googlesource.com/c/go/+/470299 TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Dmitri Goutnik <[email protected]> Reviewed-by: Bryan Mills <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Auto-Submit: Dmitri Goutnik <[email protected]>
1 parent 6af9635 commit 4c5d6ed

29 files changed

+242
-15
lines changed

src/syscall/mksyscall.pl

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ ($)
137137
# without reading the header.
138138
$text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n";
139139

140-
if (($darwin && $func eq "ptrace1") || (($openbsd && $libc) && $func eq "ptrace")) {
140+
if (($darwin && $func =~ /^ptrace1(Ptr)?$/) || (($openbsd && $libc) && $func =~ /^ptrace(Ptr)?$/)) {
141141
# The ptrace function is called from forkAndExecInChild where stack
142142
# growth is forbidden.
143143
$text .= "//go:nosplit\n"

src/syscall/mksyscall_libc.pl

+7-5
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,13 @@ ($)
145145
$sysname =~ y/A-Z/a-z/; # All libc functions are lowercase.
146146
147147
# Runtime import of function to allow cross-platform builds.
148-
$dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n";
149-
# Link symbol to proc address variable.
150-
$linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n";
151-
# Library proc address variable.
152-
push @vars, $sysvarname;
148+
if($dynimports !~ /\s+${sysvarname}\s+/) {
149+
$dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n";
150+
# Link symbol to proc address variable.
151+
$linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n";
152+
# Library proc address variable.
153+
push @vars, $sysvarname;
154+
}
153155

154156
# Go function header.
155157
$out = join(', ', @out);

src/syscall/ptrace_darwin.go

+7
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@
66

77
package syscall
88

9+
import "unsafe"
10+
911
// Nosplit because it is called from forkAndExecInChild.
1012
//
1113
//go:nosplit
1214
func ptrace(request int, pid int, addr uintptr, data uintptr) error {
1315
return ptrace1(request, pid, addr, data)
1416
}
17+
18+
//go:nosplit
19+
func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) error {
20+
return ptrace1Ptr(request, pid, addr, data)
21+
}

src/syscall/ptrace_ios.go

+7
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@
66

77
package syscall
88

9+
import "unsafe"
10+
911
// Nosplit because it is called from forkAndExecInChild.
1012
//
1113
//go:nosplit
1214
func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
1315
panic("unimplemented")
1416
}
17+
18+
//go:nosplit
19+
func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
20+
panic("unimplemented")
21+
}

src/syscall/syscall_aix.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ func (w WaitStatus) TrapCause() int { return -1 }
505505

506506
//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
507507
//sys ptrace64(request int, id int64, addr int64, data int, buff uintptr) (err error)
508+
//sys ptrace64Ptr(request int, id int64, addr int64, data int, buff unsafe.Pointer) (err error) = ptrace64
508509

509510
func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
510511
if request == PTRACE_TRACEME {
@@ -525,7 +526,7 @@ func ptracePeek(pid int, addr uintptr, out []byte) (count int, err error) {
525526
if bsize > 1024 {
526527
bsize = 1024
527528
}
528-
err = ptrace64(PT_READ_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&out[0])))
529+
err = ptrace64Ptr(PT_READ_BLOCK, int64(pid), int64(addr), bsize, unsafe.Pointer(&out[0]))
529530
if err != nil {
530531
return 0, err
531532
}
@@ -551,7 +552,7 @@ func ptracePoke(pid int, addr uintptr, data []byte) (count int, err error) {
551552
if bsize > 1024 {
552553
bsize = 1024
553554
}
554-
err = ptrace64(PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&data[0])))
555+
err = ptrace64Ptr(PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, unsafe.Pointer(&data[0]))
555556
if err != nil {
556557
return 0, err
557558
}

src/syscall/syscall_darwin_amd64.go

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func setTimeval(sec, usec int64) Timeval {
2525
//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_statfs64
2626
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_fstatat64
2727
//sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
28+
//sys ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
2829

2930
func SetKevent(k *Kevent_t, fd, mode, flags int) {
3031
k.Ident = uint64(fd)

src/syscall/syscall_darwin_arm64.go

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func setTimeval(sec, usec int64) Timeval {
2525
//sys Statfs(path string, stat *Statfs_t) (err error)
2626
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
2727
//sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
28+
//sys ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
2829

2930
func SetKevent(k *Kevent_t, fd, mode, flags int) {
3031
k.Ident = uint64(fd)

src/syscall/syscall_linux.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@ func BindToDevice(fd int, device string) (err error) {
828828
}
829829

830830
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
831+
//sys ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) = SYS_PTRACE
831832

832833
func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {
833834
// The peek requests are machine-size oriented, so we wrap it
@@ -845,7 +846,7 @@ func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err erro
845846
// boundary.
846847
n := 0
847848
if addr%sizeofPtr != 0 {
848-
err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
849+
err = ptracePtr(req, pid, addr-addr%sizeofPtr, unsafe.Pointer(&buf[0]))
849850
if err != nil {
850851
return 0, err
851852
}
@@ -857,7 +858,7 @@ func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err erro
857858
for len(out) > 0 {
858859
// We use an internal buffer to guarantee alignment.
859860
// It's not documented if this is necessary, but we're paranoid.
860-
err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
861+
err = ptracePtr(req, pid, addr+uintptr(n), unsafe.Pointer(&buf[0]))
861862
if err != nil {
862863
return n, err
863864
}
@@ -885,7 +886,7 @@ func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (c
885886
n := 0
886887
if addr%sizeofPtr != 0 {
887888
var buf [sizeofPtr]byte
888-
err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
889+
err = ptracePtr(peekReq, pid, addr-addr%sizeofPtr, unsafe.Pointer(&buf[0]))
889890
if err != nil {
890891
return 0, err
891892
}
@@ -912,7 +913,7 @@ func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (c
912913
// Trailing edge.
913914
if len(data) > 0 {
914915
var buf [sizeofPtr]byte
915-
err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
916+
err = ptracePtr(peekReq, pid, addr+uintptr(n), unsafe.Pointer(&buf[0]))
916917
if err != nil {
917918
return n, err
918919
}
@@ -937,11 +938,11 @@ func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
937938
}
938939

939940
func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
940-
return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
941+
return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
941942
}
942943

943944
func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
944-
return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
945+
return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
945946
}
946947

947948
func PtraceSetOptions(pid int, options int) (err error) {
@@ -950,7 +951,7 @@ func PtraceSetOptions(pid int, options int) (err error) {
950951

951952
func PtraceGetEventMsg(pid int) (msg uint, err error) {
952953
var data _C_long
953-
err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
954+
err = ptracePtr(PTRACE_GETEVENTMSG, pid, 0, unsafe.Pointer(&data))
954955
msg = uint(data)
955956
return
956957
}

src/syscall/syscall_openbsd_libc.go

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
6767
//sysnb execve(path *byte, argv **byte, envp **byte) (err error)
6868
//sysnb exit(res int) (err error)
6969
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
70+
//sys ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
7071
//sysnb getentropy(p []byte) (err error)
7172
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
7273
//sys fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) = SYS_fcntl

src/syscall/zsyscall_aix_ppc64.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_darwin_amd64.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_darwin_arm64.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_386.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_amd64.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_arm.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_arm64.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_loong64.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_mips.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_mips64.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_mips64le.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_mipsle.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_ppc64.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)