]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: enforce minimum buffer size to call ReadDirent
authorKeith Randall <keithr@alum.mit.edu>
Thu, 11 Apr 2019 16:09:39 +0000 (09:09 -0700)
committerKeith Randall <khr@golang.org>
Thu, 11 Apr 2019 16:25:40 +0000 (16:25 +0000)
freebsd and netbsd require a minimum buffer size of 1K.

Note this doesn't quite fix freebsd, it has other bugs,
I'll file a separate issue.

Fixes #31403

Change-Id: I9d7e78f6d30859b34715afadc4b8bd3b1ecc606b
Reviewed-on: https://go-review.googlesource.com/c/go/+/171757
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/syscall/dirent_bsd_test.go

index c0ae2a91b9b861c64fb47d66859839b451b2af41..1f8410d7fc9fc324f2d27fd1286376e5024c9db3 100644 (file)
@@ -12,6 +12,7 @@ import (
        "io/ioutil"
        "os"
        "path/filepath"
+       "runtime"
        "sort"
        "strconv"
        "strings"
@@ -79,6 +80,14 @@ func TestDirent(t *testing.T) {
 
 func TestDirentRepeat(t *testing.T) {
        const N = 100
+       // Note: the size of the buffer is small enough that the loop
+       // below will need to execute multiple times. See issue #31368.
+       size := N * unsafe.Offsetof(syscall.Dirent{}.Name) / 4
+       if runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" {
+               if size < 1024 {
+                       size = 1024 // DIRBLKSIZ, see issue 31403.
+               }
+       }
 
        // Make a directory containing N files
        d, err := ioutil.TempDir("", "direntRepeat-test")
@@ -106,9 +115,7 @@ func TestDirentRepeat(t *testing.T) {
        defer syscall.Close(fd)
        var files2 []string
        for {
-               // Note: the buf is small enough that this loop will need to
-               // execute multiple times. See issue #31368.
-               buf := make([]byte, N*unsafe.Offsetof(syscall.Dirent{}.Name)/4)
+               buf := make([]byte, size)
                n, err := syscall.ReadDirent(fd, buf)
                if err != nil {
                        t.Fatalf("syscall.readdir: %v", err)