diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 53b69ca176..09b0e1c6f7 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2015-07-10 H.J. Lu + + * 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 * readelf.c (print_mips_fp_abi_value): Handle diff --git a/binutils/readelf.c b/binutils/readelf.c index ceedf3d17b..55faf83811 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -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;