mirror of https://github.com/golang/go.git
debug/dwarf: don't crash on invalid range/rnglist offset
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. Fixes #53529 Change-Id: I318c87795e545fe5a006d16b4d361cd4bf5d502d Reviewed-on: https://go-review.googlesource.com/c/go/+/434936 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
d9d2ef991c
commit
c929a5b855
|
|
@ -13,6 +13,7 @@ package dwarf
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -1103,6 +1104,9 @@ func (d *Data) baseAddressForEntry(e *Entry) (*Entry, uint64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Data) dwarf2Ranges(u *unit, base uint64, ranges int64, ret [][2]uint64) ([][2]uint64, error) {
|
func (d *Data) dwarf2Ranges(u *unit, base uint64, ranges int64, ret [][2]uint64) ([][2]uint64, error) {
|
||||||
|
if ranges > int64(len(d.ranges)) {
|
||||||
|
return nil, fmt.Errorf("invalid range offset %d (max %d)", ranges, len(d.ranges))
|
||||||
|
}
|
||||||
buf := makeBuf(d, u, "ranges", Offset(ranges), d.ranges[ranges:])
|
buf := makeBuf(d, u, "ranges", Offset(ranges), d.ranges[ranges:])
|
||||||
for len(buf.data) > 0 {
|
for len(buf.data) > 0 {
|
||||||
low := buf.addr()
|
low := buf.addr()
|
||||||
|
|
@ -1125,6 +1129,9 @@ func (d *Data) dwarf2Ranges(u *unit, base uint64, ranges int64, ret [][2]uint64)
|
||||||
// dwarf5Ranges interprets a debug_rnglists sequence, see DWARFv5 section
|
// dwarf5Ranges interprets a debug_rnglists sequence, see DWARFv5 section
|
||||||
// 2.17.3 (page 53).
|
// 2.17.3 (page 53).
|
||||||
func (d *Data) dwarf5Ranges(u *unit, cu *Entry, base uint64, ranges int64, ret [][2]uint64) ([][2]uint64, error) {
|
func (d *Data) dwarf5Ranges(u *unit, cu *Entry, base uint64, ranges int64, ret [][2]uint64) ([][2]uint64, error) {
|
||||||
|
if ranges > int64(len(d.rngLists)) {
|
||||||
|
return nil, fmt.Errorf("invalid rnglist offset %d (max %d)", ranges, len(d.ranges))
|
||||||
|
}
|
||||||
var addrBase int64
|
var addrBase int64
|
||||||
if cu != nil {
|
if cu != nil {
|
||||||
addrBase, _ = cu.Val(AttrAddrBase).(int64)
|
addrBase, _ = cu.Val(AttrAddrBase).(int64)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue