diff options
author | MikoĊaj Baranowski <mikolajb@gmail.com> | 2018-11-10 18:09:09 +0100 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2018-11-12 23:16:31 +0000 |
commit | 5f9a5413737ba4b4f692214aebee582b47c8be74 (patch) | |
tree | b4dcd240cd407e42342e75b164b7ba316f9494de /internal/fastwalk | |
parent | 7f27c5d70a7d3c068d02c9ad0c0e18bd1cf32945 (diff) | |
download | golang-x-tools-5f9a5413737ba4b4f692214aebee582b47c8be74.tar.gz |
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>
Diffstat (limited to 'internal/fastwalk')
-rw-r--r-- | internal/fastwalk/fastwalk_dirent_namlen_linux.go | 7 | ||||
-rw-r--r-- | internal/fastwalk/fastwalk_test.go | 17 |
2 files changed, 23 insertions, 1 deletions
diff --git a/internal/fastwalk/fastwalk_dirent_namlen_linux.go b/internal/fastwalk/fastwalk_dirent_namlen_linux.go index 61896ffe7..e880d358b 100644 --- a/internal/fastwalk/fastwalk_dirent_namlen_linux.go +++ b/internal/fastwalk/fastwalk_dirent_namlen_linux.go @@ -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") } diff --git a/internal/fastwalk/fastwalk_test.go b/internal/fastwalk/fastwalk_test.go index efb813c67..a122ddf67 100644 --- a/internal/fastwalk/fastwalk_test.go +++ b/internal/fastwalk/fastwalk_test.go @@ -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": |