1
0
mirror of https://github.com/golang/go synced 2024-11-24 06:50:17 -07:00

syscall: enforce minimum buffer size to call ReadDirent

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>
This commit is contained in:
Keith Randall 2019-04-11 09:09:39 -07:00 committed by Keith Randall
parent 3cb92fcba7
commit 770f2a17d2

View File

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