Warn unsupported compress type and corrupted compressed section
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 10 Jul 2015 17:23:12 +0000 (10:23 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 10 Jul 2015 17:23:12 +0000 (10:23 -0700)
* readelf.c (dump_section_as_strings): Warn unsupported compress
type and corrupted compressed section.
(dump_section_as_bytes): Likewise.
(load_specific_debug_section): Likewise.

binutils/ChangeLog
binutils/readelf.c

index 53b69ca176b0cbb0330589bf2ebe95b0e835aee5..09b0e1c6f72a2cf5c52c489d4ef70889a5c60201 100644 (file)
@@ -1,3 +1,10 @@
+2015-07-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * readelf.c (dump_section_as_strings): Warn unsupported compress
+       type and corrupted compressed section.
+       (dump_section_as_bytes): Likewise.
+       (load_specific_debug_section): Likewise.
+
 2015-07-09  Catherine Moore  <clm@codesourcery.com>
 
         * readelf.c (print_mips_fp_abi_value): Handle
index ceedf3d17be43ccd8bc77f4c1db15b6567a37479..55faf838113d3c4f266cedee9126369400fa20a0 100644 (file)
@@ -12030,13 +12030,21 @@ dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
          unsigned int compression_header_size
            = get_compression_header (& chdr, (unsigned char *) start);
 
-         if (chdr.ch_type == ELFCOMPRESS_ZLIB
-             && chdr.ch_addralign == section->sh_addralign)
+         if (chdr.ch_type != ELFCOMPRESS_ZLIB)
            {
-             uncompressed_size = chdr.ch_size;
-             start += compression_header_size;
-             new_size -= compression_header_size;
+             warn (_("section '%s' has unsupported compress type: %d\n"),
+                   printable_section_name (section), chdr.ch_type);
+             return;
+           }
+         else if (chdr.ch_addralign != section->sh_addralign)
+           {
+             warn (_("compressed section '%s' is corrupted\n"),
+                   printable_section_name (section));
+             return;
            }
+         uncompressed_size = chdr.ch_size;
+         start += compression_header_size;
+         new_size -= compression_header_size;
        }
       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
        {
@@ -12156,13 +12164,21 @@ dump_section_as_bytes (Elf_Internal_Shdr * section,
          unsigned int compression_header_size
            = get_compression_header (& chdr, start);
 
-         if (chdr.ch_type == ELFCOMPRESS_ZLIB
-             && chdr.ch_addralign == section->sh_addralign)
+         if (chdr.ch_type != ELFCOMPRESS_ZLIB)
            {
-             uncompressed_size = chdr.ch_size;
-             start += compression_header_size;
-             new_size -= compression_header_size;
+             warn (_("section '%s' has unsupported compress type: %d\n"),
+                   printable_section_name (section), chdr.ch_type);
+             return;
            }
+         else if (chdr.ch_addralign != section->sh_addralign)
+           {
+             warn (_("compressed section '%s' is corrupted\n"),
+                   printable_section_name (section));
+             return;
+           }
+         uncompressed_size = chdr.ch_size;
+         start += compression_header_size;
+         new_size -= compression_header_size;
        }
       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
        {
@@ -12290,9 +12306,18 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
          Elf_Internal_Chdr chdr;
          unsigned int compression_header_size
            = get_compression_header (&chdr, start);
-         if (chdr.ch_type != ELFCOMPRESS_ZLIB
-             || chdr.ch_addralign != sec->sh_addralign)
-           return 0;
+         if (chdr.ch_type != ELFCOMPRESS_ZLIB)
+           {
+             warn (_("section '%s' has unsupported compress type: %d\n"),
+                   section->name, chdr.ch_type);
+             return 0;
+           }
+         else if (chdr.ch_addralign != sec->sh_addralign)
+           {
+             warn (_("compressed section '%s' is corrupted\n"),
+                   section->name);
+             return 0;
+           }
          uncompressed_size = chdr.ch_size;
          start += compression_header_size;
          size -= compression_header_size;