aboutsummaryrefslogtreecommitdiff
path: root/internal/fastwalk
diff options
context:
space:
mode:
authorMikoĊ‚aj Baranowski <mikolajb@gmail.com>2018-11-10 18:09:09 +0100
committerBrad Fitzpatrick <bradfitz@golang.org>2018-11-12 23:16:31 +0000
commit5f9a5413737ba4b4f692214aebee582b47c8be74 (patch)
treeb4dcd240cd407e42342e75b164b7ba316f9494de /internal/fastwalk
parent7f27c5d70a7d3c068d02c9ad0c0e18bd1cf32945 (diff)
downloadgolang-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.go7
-rw-r--r--internal/fastwalk/fastwalk_test.go17
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":