From 5844b4657aa2b9eb52aecc5a6338324032fb6eae Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 20 Mar 2020 11:33:07 +0000 Subject: [PATCH] Fix compile time warnings about the possibility of using uninitialised fields in the Elf_Internal_Chdr structure when building readelf. * 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. --- binutils/ChangeLog | 9 +++++++++ binutils/readelf.c | 34 +++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 95761e07e7..de41d8d666 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,12 @@ +2020-03-20 Nick Clifton + + * 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. + 2020-03-20 H.J. Lu * ar.c (main): Update bfd_plugin_set_program_name call. 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 (_(" []\n")); else - printf (_(" [: 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 (_(" [: 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) { -- 2.34.1