From 907b52f4ceb6d15b00a0ac5fc7a7029f8a80b97d Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 3 Oct 2022 13:19:21 +0100 Subject: [PATCH] readelf: DO not load section headers from file offset zero * readelf.c (get_32bit_section_headers): Return false if the e_shoff field is zero. (get_64bit_section_headers): Likewise. --- binutils/ChangeLog | 6 ++++++ binutils/readelf.c | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 38debded7dd..8690d7811ee 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2022-10-03 Nick Clifton + + * readelf.c (get_32bit_section_headers): Return false if the + e_shoff field is zero. + (get_64bit_section_headers): Likewise. + 2022-09-28 Nick Clifton PR 29628 diff --git a/binutils/readelf.c b/binutils/readelf.c index 351571c8abb..8c6c0389fe7 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -6365,6 +6365,13 @@ get_32bit_section_headers (Filedata * filedata, bool probe) /* PR binutils/17531: Cope with unexpected section header sizes. */ if (size == 0 || num == 0) return false; + + /* The section header cannot be at the start of the file - that is + where the ELF file header is located. A file with absolutely no + sections in it will use a shoff of 0. */ + if (filedata->file_header.e_shoff == 0) + return false; + if (size < sizeof * shdrs) { if (! probe) @@ -6429,6 +6436,12 @@ get_64bit_section_headers (Filedata * filedata, bool probe) if (size == 0 || num == 0) return false; + /* The section header cannot be at the start of the file - that is + where the ELF file header is located. A file with absolutely no + sections in it will use a shoff of 0. */ + if (filedata->file_header.e_shoff == 0) + return false; + if (size < sizeof * shdrs) { if (! probe) -- 2.39.5