readelf: DO not load section headers from file offset zero
authorNick Clifton <nickc@redhat.com>
Mon, 3 Oct 2022 12:19:21 +0000 (13:19 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 3 Oct 2022 12:19:21 +0000 (13:19 +0100)
* readelf.c (get_32bit_section_headers): Return false if the
e_shoff field is zero.
(get_64bit_section_headers): Likewise.

binutils/ChangeLog
binutils/readelf.c

index 38debded7dd682e75f981fe4877de8e12a915cf9..8690d7811ee82d4775026fed11435db54dd8e731 100644 (file)
@@ -1,3 +1,9 @@
+2022-10-03  Nick Clifton  <nickc@redhat.com>
+
+       * 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  <nickc@redhat.com>
 
        PR 29628
index 351571c8abbc4665a4fc0209b7e621feb74b0757..8c6c0389fe73e07be119c87b9f6b817af99f3e92 100644 (file)
@@ -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)