Warn unsupported compress type and corrupted compressed section
[external/binutils.git] / binutils / readelf.c
index ceedf3d..55faf83 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;