From: Mark Wielaard Date: Sat, 13 Feb 2016 19:00:37 +0000 (+0100) Subject: readelf: Warn when uncompressing fails and error when gelf_getshdr fails. X-Git-Tag: elfutils-0.166~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=134684912cd18e824172b667ba13d1016782f93f;p=thirdparty%2Felfutils.git readelf: Warn when uncompressing fails and error when gelf_getshdr fails. After decompressing we want to get the new shdr. This can theoretically fail so we have to check. Also warn the user if a section couldn't be uncompressed. Signed-off-by: Mark Wielaard --- diff --git a/src/ChangeLog b/src/ChangeLog index debf5a42e..fb9c77679 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2016-02-13 Mark Wielaard + + * readelf.c (print_scngrp): Call error when gelf_getshdr fails. + (print_symtab): Likewise. + (handle_hash): Likewise. + (dump_data_section): Print a warning if decompressing fails. + (print_string_section): Likewise. + 2016-02-13 Mark Wielaard * elfcompress.c (parse_opt): Don't fallthrough after processing -q. diff --git a/src/readelf.c b/src/readelf.c index a25e4ac48..f1572906b 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -1,5 +1,5 @@ /* Print information from ELF file in human-readable form. - Copyright (C) 1999-2015 Red Hat, Inc. + Copyright (C) 1999-2016 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper , 1999. @@ -1529,6 +1529,11 @@ print_scngrp (Ebl *ebl) gettext ("Couldn't uncompress section"), elf_ndxscn (scn)); shdr = gelf_getshdr (scn, &shdr_mem); + if (unlikely (shdr == NULL)) + error (EXIT_FAILURE, 0, + gettext ("cannot get section [%zd] header: %s"), + elf_ndxscn (scn), + elf_errmsg (-1)); } handle_scngrp (ebl, scn, shdr); } @@ -2238,6 +2243,10 @@ print_symtab (Ebl *ebl, int type) gettext ("Couldn't uncompress section"), elf_ndxscn (scn)); shdr = gelf_getshdr (scn, &shdr_mem); + if (unlikely (shdr == NULL)) + error (EXIT_FAILURE, 0, + gettext ("cannot get section [%zd] header: %s"), + elf_ndxscn (scn), elf_errmsg (-1)); } handle_symtab (ebl, scn, shdr); } @@ -3317,6 +3326,10 @@ handle_hash (Ebl *ebl) gettext ("Couldn't uncompress section"), elf_ndxscn (scn)); shdr = gelf_getshdr (scn, &shdr_mem); + if (unlikely (shdr == NULL)) + error (EXIT_FAILURE, 0, + gettext ("cannot get section [%zd] header: %s"), + elf_ndxscn (scn), elf_errmsg (-1)); } if (shdr->sh_type == SHT_HASH) @@ -9509,9 +9522,19 @@ dump_data_section (Elf_Scn *scn, const GElf_Shdr *shdr, const char *name) so we can show both the original shdr size and the uncompressed data size. */ if ((shdr->sh_flags & SHF_COMPRESSED) != 0) - elf_compress (scn, 0, 0); + { + if (elf_compress (scn, 0, 0) < 0) + printf ("WARNING: %s [%zd]\n", + gettext ("Couldn't uncompress section"), + elf_ndxscn (scn)); + } else if (strncmp (name, ".zdebug", strlen (".zdebug")) == 0) - elf_compress_gnu (scn, 0, 0); + { + if (elf_compress_gnu (scn, 0, 0) < 0) + printf ("WARNING: %s [%zd]\n", + gettext ("Couldn't uncompress section"), + elf_ndxscn (scn)); + } } Elf_Data *data = elf_rawdata (scn, NULL); @@ -9550,9 +9573,19 @@ print_string_section (Elf_Scn *scn, const GElf_Shdr *shdr, const char *name) so we can show both the original shdr size and the uncompressed data size. */ if ((shdr->sh_flags & SHF_COMPRESSED) != 0) - elf_compress (scn, 0, 0); + { + if (elf_compress (scn, 0, 0) < 0) + printf ("WARNING: %s [%zd]\n", + gettext ("Couldn't uncompress section"), + elf_ndxscn (scn)); + } else if (strncmp (name, ".zdebug", strlen (".zdebug")) == 0) - elf_compress_gnu (scn, 0, 0); + { + if (elf_compress_gnu (scn, 0, 0) < 0) + printf ("WARNING: %s [%zd]\n", + gettext ("Couldn't uncompress section"), + elf_ndxscn (scn)); + } } Elf_Data *data = elf_rawdata (scn, NULL);