]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
readelf: Warn when uncompressing fails and error when gelf_getshdr fails.
authorMark Wielaard <mjw@redhat.com>
Sat, 13 Feb 2016 19:00:37 +0000 (20:00 +0100)
committerMark Wielaard <mjw@redhat.com>
Mon, 22 Feb 2016 11:18:13 +0000 (12:18 +0100)
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 <mjw@redhat.com>
src/ChangeLog
src/readelf.c

index debf5a42e375b61982efdbf2a24dc45cf11d5bc9..fb9c77679526b5991184a6af9efaae92a4638f4a 100644 (file)
@@ -1,3 +1,11 @@
+2016-02-13  Mark Wielaard  <mjw@redhat.com>
+
+       * 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  <mjw@redhat.com>
 
        * elfcompress.c (parse_opt): Don't fallthrough after processing -q.
index a25e4ac48d5ca186b6af14c3d3c96e5f72a8f20d..f1572906b83dc8f590b8fc3e6574305d0e22ee96 100644 (file)
@@ -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 <drepper@redhat.com>, 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);