aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2023-02-27 15:30:42 -0800
committerGopher Robot <gobot@golang.org>2023-02-28 18:09:18 +0000
commit62043a6cd5fa39b29298c9f03beceb65ffe167e0 (patch)
tree1ced7dfc0b69411de002f6034c37efba005ffca7 /src
parentd61ae9ded4ebc142fb0edccfee893fa10c233357 (diff)
downloadgo-62043a6cd5fa39b29298c9f03beceb65ffe167e0.tar.xz
internal/xcoff: use saferio to allocate slices
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #58754 Change-Id: Ic3ef58b204b946f8bff80310d4c8dfcbb2939a1c Reviewed-on: https://go-review.googlesource.com/c/go/+/471678 Auto-Submit: Ian Lance Taylor <iant@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> Run-TryBot: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/internal/xcoff/file.go43
1 files changed, 27 insertions, 16 deletions
diff --git a/src/internal/xcoff/file.go b/src/internal/xcoff/file.go
index 536bd74c30..9135822f22 100644
--- a/src/internal/xcoff/file.go
+++ b/src/internal/xcoff/file.go
@@ -225,7 +225,11 @@ func NewFile(r io.ReaderAt) (*File, error) {
if _, err := sr.Seek(int64(hdrsz)+int64(opthdr), io.SeekStart); err != nil {
return nil, err
}
- f.Sections = make([]*Section, nscns)
+ c := saferio.SliceCap((**Section)(nil), uint64(nscns))
+ if c < 0 {
+ return nil, fmt.Errorf("too many XCOFF sections (%d)", nscns)
+ }
+ f.Sections = make([]*Section, 0, c)
for i := 0; i < int(nscns); i++ {
var scnptr uint64
s := new(Section)
@@ -261,7 +265,7 @@ func NewFile(r io.ReaderAt) (*File, error) {
}
s.sr = io.NewSectionReader(r2, int64(scnptr), int64(s.Size))
s.ReaderAt = s.sr
- f.Sections[i] = s
+ f.Sections = append(f.Sections, s)
}
// Symbol map needed by relocation
@@ -388,34 +392,39 @@ func NewFile(r io.ReaderAt) (*File, error) {
// Read relocations
// Only for .data or .text section
- for _, sect := range f.Sections {
+ for sectNum, sect := range f.Sections {
if sect.Type != STYP_TEXT && sect.Type != STYP_DATA {
continue
}
- sect.Relocs = make([]Reloc, sect.Nreloc)
if sect.Relptr == 0 {
continue
}
+ c := saferio.SliceCap((*Reloc)(nil), uint64(sect.Nreloc))
+ if c < 0 {
+ return nil, fmt.Errorf("too many relocs (%d) for section %d", sect.Nreloc, sectNum)
+ }
+ sect.Relocs = make([]Reloc, 0, c)
if _, err := sr.Seek(int64(sect.Relptr), io.SeekStart); err != nil {
return nil, err
}
for i := uint32(0); i < sect.Nreloc; i++ {
+ var reloc Reloc
switch f.TargetMachine {
case U802TOCMAGIC:
rel := new(Reloc32)
if err := binary.Read(sr, binary.BigEndian, rel); err != nil {
return nil, err
}
- sect.Relocs[i].VirtualAddress = uint64(rel.Rvaddr)
- sect.Relocs[i].Symbol = idxToSym[int(rel.Rsymndx)]
- sect.Relocs[i].Type = rel.Rtype
- sect.Relocs[i].Length = rel.Rsize&0x3F + 1
+ reloc.VirtualAddress = uint64(rel.Rvaddr)
+ reloc.Symbol = idxToSym[int(rel.Rsymndx)]
+ reloc.Type = rel.Rtype
+ reloc.Length = rel.Rsize&0x3F + 1
if rel.Rsize&0x80 != 0 {
- sect.Relocs[i].Signed = true
+ reloc.Signed = true
}
if rel.Rsize&0x40 != 0 {
- sect.Relocs[i].InstructionFixed = true
+ reloc.InstructionFixed = true
}
case U64_TOCMAGIC:
@@ -423,17 +432,19 @@ func NewFile(r io.ReaderAt) (*File, error) {
if err := binary.Read(sr, binary.BigEndian, rel); err != nil {
return nil, err
}
- sect.Relocs[i].VirtualAddress = rel.Rvaddr
- sect.Relocs[i].Symbol = idxToSym[int(rel.Rsymndx)]
- sect.Relocs[i].Type = rel.Rtype
- sect.Relocs[i].Length = rel.Rsize&0x3F + 1
+ reloc.VirtualAddress = rel.Rvaddr
+ reloc.Symbol = idxToSym[int(rel.Rsymndx)]
+ reloc.Type = rel.Rtype
+ reloc.Length = rel.Rsize&0x3F + 1
if rel.Rsize&0x80 != 0 {
- sect.Relocs[i].Signed = true
+ reloc.Signed = true
}
if rel.Rsize&0x40 != 0 {
- sect.Relocs[i].InstructionFixed = true
+ reloc.InstructionFixed = true
}
}
+
+ sect.Relocs = append(sect.Relocs, reloc)
}
}