]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
readelf: Check phdr != NULL or shdr != NULL in handle_dynamic.
authorMark Wielaard <mark@klomp.org>
Thu, 3 Nov 2022 12:38:45 +0000 (13:38 +0100)
committerMark Wielaard <mark@klomp.org>
Thu, 3 Nov 2022 12:38:45 +0000 (13:38 +0100)
The compiler doesn't know that when use_dynamic_segment is true,
then phdr should/will be non-NULL and otherwise shdr is non-NULL.
Add explicit checks to help the compiler out and in case an error
is made calling the handle_dynamic function.

Signed-off-by: Mark Wielaard <mark@klomp.org>
src/ChangeLog
src/readelf.c

index d3399a5caf9240aff07c7e3c45e4b12d1cf6b869..0c5ab37ee68f059a835f625c0916eba1b28907b8 100644 (file)
@@ -1,3 +1,8 @@
+2022-11-03  Mark Wielaard  <mark@klomp.org>
+
+       * readelf.c (handle_dynamic): Check phdr != NULL when
+       use_dynamic_segment, otherwise check shdr != NULL.
+
 2022-10-28  Arsen Arsenović  <arsen@aarsen.me>
 
        * readelf.c (options): Add Binutils-style --syms alias.
index 0e0b05c44edf64e6395effbdcd8207207ac28d2d..e721a2099e4a941cee340109d52989e196edfa82 100644 (file)
@@ -1828,7 +1828,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
   size_t dyn_ents;
 
   /* Get the data of the section.  */
-  if (use_dynamic_segment)
+  if (use_dynamic_segment && phdr != NULL)
     data = elf_getdata_rawchunk(ebl->elf, phdr->p_offset,
                                phdr->p_filesz, ELF_T_DYN);
   else
@@ -1840,7 +1840,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
   /* Get the dynamic section entry number */
   dyn_ents = get_dyn_ents (data);
 
-  if (!use_dynamic_segment)
+  if (!use_dynamic_segment && shdr != NULL)
     {
       /* Get the section header string table index.  */
       if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
@@ -1862,7 +1862,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
              (int) shdr->sh_link,
              elf_strptr (ebl->elf, shstrndx, glink->sh_name));
     }
-  else
+  else if (phdr != NULL)
     {
       printf (ngettext ("\
 \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "\n",
@@ -1879,7 +1879,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
   /* if --use-dynamic option is enabled,
      use the string table to get the related library info.  */
   Elf_Data *strtab_data = NULL;
-  if (use_dynamic_segment)
+  if (use_dynamic_segment && phdr != NULL)
     {
       strtab_data = get_dynscn_strtab(ebl->elf, phdr);
       if (strtab_data == NULL)
@@ -1903,7 +1903,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
          || dyn->d_tag == DT_RPATH
          || dyn->d_tag == DT_RUNPATH)
        {
-         if (! use_dynamic_segment)
+         if (! use_dynamic_segment && shdr != NULL)
            name = elf_strptr (ebl->elf, shdr->sh_link, dyn->d_un.d_val);
          else if (dyn->d_un.d_val < strtab_data->d_size
                   && memrchr (strtab_data->d_buf + dyn->d_un.d_val, '\0',