https://sourceware.org/bugzilla/show_bug.cgi?id=29370
Bug ID: 29370
Summary: dwarf.c: infinite loop in display_debug_abbrev
Product: binutils
Version: 2.40 (HEAD)
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: binutils
Assignee: unassigned at sourceware dot org
Reporter: h3xrabbit at gmail dot com
Target Milestone: ---
Created attachment 14211
--> https://sourceware.org/bugzilla/attachment.cgi?id=14211&action=edit
file that caused infinite loop
During fuzzing campaign, I found some files will cause infinite loop inside
`display_debug_abbrev()` with the command below:
readelf -w poc
build on the latest commit (9afca381e2e46ccee433ce09001506e7683b273f), with
default config `../configure`
Command output:
readelf: Warning: The e_shentsize field in the ELF header is larger than the
size of an ELF section header
readelf: Error: Reading 3584 bytes extends past end of file for program headers
readelf: Error: Reading 1717502016 bytes extends past end of file for
.trace_abbrev section data
... warnings ...
Contents of the .trace_abbrev section:
... contents ...
Section '.trace_abbrev' has no debugging data.
Contents of the .trace_abbrev section:
Number TAG (0x0)
3878592198768 DW_TAG_padding[no children]
Unknown AT value: 70e1c3870e1c3870 Unknown FORM value: 45
DW_AT_virtuality Unknown FORM value: 46
DW_AT_location DW_FORM_addr
DW_AT_sibling DW_FORM value: 0
DW_AT value: 0 DW_FORM value: 0
readelf: Warning: Debug info is corrupted, abbrev offset (1240) is larger than
abbrev section size (8)
Contents of the .trace_abbrev section:
Number TAG (0x0)
3878592198768 DW_TAG_padding[no children]
Unknown AT value: 70e1c3870e1c3870 Unknown FORM value: 45
DW_AT_virtuality Unknown FORM value: 46
DW_AT_location DW_FORM_addr
DW_AT_sibling DW_FORM value: 0
DW_AT value: 0 DW_FORM value: 0
... looping same contents ...
I observed through gdb when the program starts to loop, break on `if (list ==
NULL)` line and print out the variables:
gdb$ p start
$43 = (unsigned char *) 0x55660b70 "\177ELF.trace_abbrev"
gdb$ p section->start
$44 = (unsigned char *) 0x55660b70 "\177ELF.trace_abbrev"
gdb$ p *list
$45 = {
first_abbrev = 0x5565f3d0,
last_abbrev = 0x5565f3d0,
abbrev_base = 0x0,
abbrev_offset = 0x0,
next = 0x0,
start_of_next_abbrevs = 0x55660b70 "\177ELF.trace_abbrev"
}
The `offset` variable will always be 0, and the `start` variable will never
updated since `list->start_of_next_abbrevs` is the same as `start`, maybe it's
caused by entering this function more than once?
--
You are receiving this mail because:
You are on the CC list for the bug.