diff options
author | Alan Modra <amodra@gmail.com> | 2021-06-12 10:54:21 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-06-12 11:00:32 +0930 |
commit | e331b18d42d38fa4542f4c50536717a43546290b (patch) | |
tree | 1da359f3de751d289b763bd1473318af59effe19 /binutils | |
parent | 6fe7f5c4161053d663d1be34308be2e5f1531fbc (diff) | |
download | gdb-e331b18d42d38fa4542f4c50536717a43546290b.zip gdb-e331b18d42d38fa4542f4c50536717a43546290b.tar.gz gdb-e331b18d42d38fa4542f4c50536717a43546290b.tar.bz2 |
Re: readelf section reading
Fix commit 4de91c10cdd9, which cached the single section header read
to pick up file header extension fields. Also, testing e_shoff in
get_section_headers opened a hole for fuzzers where we'd end up with
segfaults due to non-zero e_shnum but NULL section_headers.
* readelf.c (get_section_headers): Don't test e_shoff here, leave
that to get_32bit_section_headers or get_64bit_section_headers.
(process_object): Throw away section header read to print file
header extension.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 7 | ||||
-rw-r--r-- | binutils/readelf.c | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index e84f5d3..fcf6056 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2021-06-12 Alan Modra <amodra@gmail.com> + + * readelf.c (get_section_headers): Don't test e_shoff here, leave + that to get_32bit_section_headers or get_64bit_section_headers. + (process_object): Throw away section header read to print file + header extension. + 2021-06-11 Alan Modra <amodra@gmail.com> * readelf.c (struct filedata): Move archive_file_offset and diff --git a/binutils/readelf.c b/binutils/readelf.c index 1456c03..4217ea3 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -5859,9 +5859,6 @@ get_section_headers (Filedata *filedata, bool probe) if (filedata->section_headers != NULL) return true; - if (filedata->file_header.e_shoff == 0) - return true; - if (is_32bit_elf) return get_32bit_section_headers (filedata, probe); else @@ -21361,6 +21358,11 @@ process_object (Filedata * filedata) goto out; } + /* Throw away the single section header read above, so that we + re-read the entire set. */ + free (filedata->section_headers); + filedata->section_headers = NULL; + if (! process_section_headers (filedata)) { /* Without loaded section headers we cannot process lots of things. */ |