From: Zeke Lu Date: Mon, 24 Oct 2022 23:37:05 +0000 (+0000) Subject: debug/elf: use saferio.SliceCap when decoding ELF sections X-Git-Tag: go1.20rc1~539 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2bdb5c57f1efcbddab536028d053798e35de6226;p=gostls13.git debug/elf: use saferio.SliceCap when decoding ELF sections This avoids allocating an overly large slice for corrupt input. No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. Updates #33121. Change-Id: Ie2d947a3865d3499034286f2d08d3e3204015f3e GitHub-Last-Rev: 6c62fc3cec1c6343c76f22f6a2a4ddae060fa2f4 GitHub-Pull-Request: golang/go#56405 Reviewed-on: https://go-review.googlesource.com/c/go/+/445076 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Heschi Kreinick --- diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go index 708980bc1c..7c5ac86c0a 100644 --- a/src/debug/elf/file.go +++ b/src/debug/elf/file.go @@ -467,8 +467,12 @@ func NewFile(r io.ReaderAt) (*File, error) { } // Read section headers - f.Sections = make([]*Section, shnum) - names := make([]uint32, shnum) + c := saferio.SliceCap((*Section)(nil), uint64(shnum)) + if c < 0 { + return nil, &FormatError{0, "too many sections", shnum} + } + f.Sections = make([]*Section, 0, c) + names := make([]uint32, 0, c) for i := 0; i < shnum; i++ { off := shoff + int64(i)*int64(shentsize) sr.Seek(off, seekStart) @@ -479,7 +483,7 @@ func NewFile(r io.ReaderAt) (*File, error) { if err := binary.Read(sr, f.ByteOrder, sh); err != nil { return nil, err } - names[i] = sh.Name + names = append(names, sh.Name) s.SectionHeader = SectionHeader{ Type: SectionType(sh.Type), Flags: SectionFlag(sh.Flags), @@ -496,7 +500,7 @@ func NewFile(r io.ReaderAt) (*File, error) { if err := binary.Read(sr, f.ByteOrder, sh); err != nil { return nil, err } - names[i] = sh.Name + names = append(names, sh.Name) s.SectionHeader = SectionHeader{ Type: SectionType(sh.Type), Flags: SectionFlag(sh.Flags), @@ -544,7 +548,7 @@ func NewFile(r io.ReaderAt) (*File, error) { } } - f.Sections[i] = s + f.Sections = append(f.Sections, s) } if len(f.Sections) == 0 {