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.
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 @@
   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 @@
       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.  */