]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: make TestGetdirentries checkptr safe
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 24 Oct 2019 03:54:05 +0000 (20:54 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 24 Oct 2019 04:36:53 +0000 (04:36 +0000)
Fixes Darwin.

Updates #35092

Change-Id: I045f070c8549d00610b459e3a82cac870d9ddb54
Reviewed-on: https://go-review.googlesource.com/c/go/+/203077
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/syscall/getdirentries_test.go

index 8505a0bb8972d99fc219c26e24bf3278cb20a1ba..1cbed8d4f7ba31e86249e080c0b206eb79e62709 100644 (file)
@@ -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++ {