mirror of
https://github.com/golang/go
synced 2024-11-18 08:14:41 -07:00
internal/fastwalk: avoid slice bounds out of range for long file names
Fixes golang/go#28715 Change-Id: Ibed78d2376f4ec010ee9e5e772069afd14fd5552 Reviewed-on: https://go-review.googlesource.com/c/148884 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
7f27c5d70a
commit
5f9a541373
@ -16,7 +16,12 @@ import (
|
||||
func direntNamlen(dirent *syscall.Dirent) uint64 {
|
||||
const fixedHdr = uint16(unsafe.Offsetof(syscall.Dirent{}.Name))
|
||||
nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0]))
|
||||
nameLen := bytes.IndexByte(nameBuf[:dirent.Reclen-fixedHdr], 0)
|
||||
const nameBufLen = uint16(len(nameBuf))
|
||||
limit := dirent.Reclen - fixedHdr
|
||||
if limit > nameBufLen {
|
||||
limit = nameBufLen
|
||||
}
|
||||
nameLen := bytes.IndexByte(nameBuf[:limit], 0)
|
||||
if nameLen < 0 {
|
||||
panic("failed to find terminating 0 byte in dirent")
|
||||
}
|
||||
|
@ -98,6 +98,23 @@ func TestFastWalk_Basic(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestFastWalk_LongFileName(t *testing.T) {
|
||||
longFileName := strings.Repeat("x", 255)
|
||||
|
||||
testFastWalk(t, map[string]string{
|
||||
longFileName: "one",
|
||||
},
|
||||
func(path string, typ os.FileMode) error {
|
||||
return nil
|
||||
},
|
||||
map[string]os.FileMode{
|
||||
"": os.ModeDir,
|
||||
"/src": os.ModeDir,
|
||||
"/src/" + longFileName: 0,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestFastWalk_Symlink(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "windows", "plan9":
|
||||
|
Loading…
Reference in New Issue
Block a user