From: Brad Fitzpatrick Date: Thu, 24 Oct 2019 03:54:05 +0000 (-0700) Subject: syscall: make TestGetdirentries checkptr safe X-Git-Tag: go1.14beta1~602 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=68981bf309be6143dd4cd769ffa94e9347de1fbb;p=gostls13.git syscall: make TestGetdirentries checkptr safe Fixes Darwin. Updates #35092 Change-Id: I045f070c8549d00610b459e3a82cac870d9ddb54 Reviewed-on: https://go-review.googlesource.com/c/go/+/203077 Run-TryBot: Brad Fitzpatrick Reviewed-by: Cuong Manh Le Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/syscall/getdirentries_test.go b/src/syscall/getdirentries_test.go index 8505a0bb89..1cbed8d4f7 100644 --- a/src/syscall/getdirentries_test.go +++ b/src/syscall/getdirentries_test.go @@ -66,7 +66,15 @@ func testGetdirentries(t *testing.T, count int) { } data := buf[:n] for len(data) > 0 { - dirent := (*syscall.Dirent)(unsafe.Pointer(&data[0])) + // syscall.Getdirentries's return value may be (and usually is) much + // smaller than a syscall.Dirent, which has lots of padding for + // the name at the end. The compiler's checkptr validation doesn't like + // that. So allocate direntMem that's always big enough, and use that + // when converting to *syscall.Dirent. + var direntMem [unsafe.Sizeof(syscall.Dirent{})]byte + copy(direntMem[:], data) + dirent := (*syscall.Dirent)(unsafe.Pointer(&direntMem[0])) + data = data[dirent.Reclen:] name := make([]byte, dirent.Namlen) for i := 0; i < int(dirent.Namlen); i++ {