public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Commit: Always check the return value from get_compression_header
@ 2020-03-20 11:32 Nick Clifton
  0 siblings, 0 replies; only message in thread
From: Nick Clifton @ 2020-03-20 11:32 UTC (permalink / raw)
  To: binutils

Hi Guys,

  I am checking in the patch below to fix a few compile time warnings
  about using uninitialized values which can be generated when
  compiling readelf with gcc-11.  The issue is that the 
  get_compression_header function does not initialise the
  Elf_Internal_Chdr structure if it fails to read the header.  But there
  was code that assumed that the function always succeeded and so used
  fields in the header without checking them.

Cheers
  Nick

binutils/ChangeLog
2020-03-20  Nick Clifton  <nickc@redhat.com>

	* readelf.c (get_compression_header): Add ATTRIBUTE_WARN_UNUSED_RESULT.
	(process_section_headers): Check the return value from
	get_compression_header.
	(dump_section_as_strings): Likewise.
	(dump_section_as_bytes): Likewise.
	(load_specific_debug_section): Likewise.

diff --git a/binutils/readelf.c b/binutils/readelf.c
index 66d91a37b7..61f0617683 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -6076,7 +6076,7 @@ get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
   return buff;
 }
 
-static unsigned int
+static unsigned int ATTRIBUTE_WARN_UNUSED_RESULT
 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
 {
   if (is_32bit_elf)
@@ -6728,15 +6728,18 @@ process_section_headers (Filedata * filedata)
 		{
 		  Elf_Internal_Chdr chdr;
 
-		  (void) get_compression_header (&chdr, buf, sizeof (buf));
-
-		  if (chdr.ch_type == ELFCOMPRESS_ZLIB)
-		    printf ("       ZLIB, ");
+		  if (get_compression_header (&chdr, buf, sizeof (buf)) == 0)
+		    printf (_("       [<corrupt>]\n"));
 		  else
-		    printf (_("       [<unknown>: 0x%x], "),
-			    chdr.ch_type);
-		  print_vma (chdr.ch_size, LONG_HEX);
-		  printf (", %lu\n", (unsigned long) chdr.ch_addralign);
+		    {
+		      if (chdr.ch_type == ELFCOMPRESS_ZLIB)
+			printf ("       ZLIB, ");
+		      else
+			printf (_("       [<unknown>: 0x%x], "),
+				chdr.ch_type);
+		      print_vma (chdr.ch_size, LONG_HEX);
+		      printf (", %lu\n", (unsigned long) chdr.ch_addralign);
+		    }
 		}
 	    }
 	}
@@ -13692,6 +13695,10 @@ dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
 	  unsigned int compression_header_size
 	    = get_compression_header (& chdr, (unsigned char *) start,
 				      num_bytes);
+	  if (compression_header_size == 0)
+	    /* An error message will have already been generated
+	       by get_compression_header.  */
+	    goto error_out;
 
 	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
 	    {
@@ -13904,6 +13911,11 @@ dump_section_as_bytes (Elf_Internal_Shdr *  section,
 	  unsigned int compression_header_size
 	    = get_compression_header (& chdr, start, section_size);
 
+	  if (compression_header_size == 0)
+	    /* An error message will have already been generated
+	       by get_compression_header.  */
+	    goto error_out;
+
 	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
 	    {
 	      warn (_("section '%s' has unsupported compress type: %d\n"),
@@ -14237,6 +14249,10 @@ load_specific_debug_section (enum dwarf_section_display_enum  debug,
 	    }
 
 	  compression_header_size = get_compression_header (&chdr, start, size);
+	  if (compression_header_size == 0)
+	    /* An error message will have already been generated
+	       by get_compression_header.  */
+	    return FALSE;
 
 	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
 	    {


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-03-20 11:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-20 11:32 Commit: Always check the return value from get_compression_header Nick Clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).