internal/syscall/unix: use runtime.gostring for Gostring

Under the race detector, checkptr flags uses of unsafe.Slice that
result in slices that straddle multiple Go allocations.
Avoid that scenario by calling existing runtime code.

This fixes a failure on the darwin-.*-race builders introduced in
CL 446178.

Change-Id: I6e0fdb37e3c3f38d97939a8799bb4d10f519c5b9
Reviewed-on: https://go-review.googlesource.com/c/go/+/449936
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Ian Lance Taylor 2022-11-11 12:42:51 -08:00 committed by Gopher Robot
parent 7e4191e686
commit 122a22e0e9
2 changed files with 11 additions and 10 deletions

View file

@ -95,17 +95,11 @@ func GaiStrerror(ecode int) string {
return GoString((*byte)(unsafe.Pointer(r1)))
}
// Implemented in the runtime package.
func gostring(*byte) string
func GoString(p *byte) string {
if p == nil {
return ""
}
x := unsafe.Slice(p, 1e9)
for i, c := range x {
if c == 0 {
return string(x[:i])
}
}
return ""
return gostring(p)
}
//go:linkname syscall_syscall syscall.syscall

View file

@ -325,6 +325,13 @@ func gostring(p *byte) string {
return s
}
// internal_syscall_gostring is a version of gostring for internal/syscall/unix.
//
//go:linkname internal_syscall_gostring internal/syscall/unix.gostring
func internal_syscall_gostring(p *byte) string {
return gostring(p)
}
func gostringn(p *byte, l int) string {
if l == 0 {
return ""