Mark Wielaard 34ba07
commit 75f2de448f311807e2493f2a37a980e2d872b229
Mark Wielaard 34ba07
Author: Mark Wielaard <mark@klomp.org>
Mark Wielaard 34ba07
Date:   Thu Nov 3 13:38:45 2022 +0100
Mark Wielaard 34ba07
Mark Wielaard 34ba07
    readelf: Check phdr != NULL or shdr != NULL in handle_dynamic.
Mark Wielaard 34ba07
    
Mark Wielaard 34ba07
    The compiler doesn't know that when use_dynamic_segment is true,
Mark Wielaard 34ba07
    then phdr should/will be non-NULL and otherwise shdr is non-NULL.
Mark Wielaard 34ba07
    Add explicit checks to help the compiler out and in case an error
Mark Wielaard 34ba07
    is made calling the handle_dynamic function.
Mark Wielaard 34ba07
    
Mark Wielaard 34ba07
    Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard 34ba07
Mark Wielaard 34ba07
diff --git a/src/readelf.c b/src/readelf.c
Mark Wielaard 34ba07
index 0e0b05c4..e721a209 100644
Mark Wielaard 34ba07
--- a/src/readelf.c
Mark Wielaard 34ba07
+++ b/src/readelf.c
Mark Wielaard 34ba07
@@ -1828,7 +1828,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
Mark Wielaard 34ba07
   size_t dyn_ents;
Mark Wielaard 34ba07
 
Mark Wielaard 34ba07
   /* Get the data of the section.  */
Mark Wielaard 34ba07
-  if (use_dynamic_segment)
Mark Wielaard 34ba07
+  if (use_dynamic_segment && phdr != NULL)
Mark Wielaard 34ba07
     data = elf_getdata_rawchunk(ebl->elf, phdr->p_offset,
Mark Wielaard 34ba07
 				phdr->p_filesz, ELF_T_DYN);
Mark Wielaard 34ba07
   else
Mark Wielaard 34ba07
@@ -1840,7 +1840,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
Mark Wielaard 34ba07
   /* Get the dynamic section entry number */
Mark Wielaard 34ba07
   dyn_ents = get_dyn_ents (data);
Mark Wielaard 34ba07
 
Mark Wielaard 34ba07
-  if (!use_dynamic_segment)
Mark Wielaard 34ba07
+  if (!use_dynamic_segment && shdr != NULL)
Mark Wielaard 34ba07
     {
Mark Wielaard 34ba07
       /* Get the section header string table index.  */
Mark Wielaard 34ba07
       if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
Mark Wielaard 34ba07
@@ -1862,7 +1862,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
Mark Wielaard 34ba07
 	      (int) shdr->sh_link,
Mark Wielaard 34ba07
 	      elf_strptr (ebl->elf, shstrndx, glink->sh_name));
Mark Wielaard 34ba07
     }
Mark Wielaard 34ba07
-  else
Mark Wielaard 34ba07
+  else if (phdr != NULL)
Mark Wielaard 34ba07
     {
Mark Wielaard 34ba07
       printf (ngettext ("\
Mark Wielaard 34ba07
 \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "\n",
Mark Wielaard 34ba07
@@ -1879,7 +1879,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
Mark Wielaard 34ba07
   /* if --use-dynamic option is enabled,
Mark Wielaard 34ba07
      use the string table to get the related library info.  */
Mark Wielaard 34ba07
   Elf_Data *strtab_data = NULL;
Mark Wielaard 34ba07
-  if (use_dynamic_segment)
Mark Wielaard 34ba07
+  if (use_dynamic_segment && phdr != NULL)
Mark Wielaard 34ba07
     {
Mark Wielaard 34ba07
       strtab_data = get_dynscn_strtab(ebl->elf, phdr);
Mark Wielaard 34ba07
       if (strtab_data == NULL)
Mark Wielaard 34ba07
@@ -1903,7 +1903,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
Mark Wielaard 34ba07
 	  || dyn->d_tag == DT_RPATH
Mark Wielaard 34ba07
 	  || dyn->d_tag == DT_RUNPATH)
Mark Wielaard 34ba07
 	{
Mark Wielaard 34ba07
-	  if (! use_dynamic_segment)
Mark Wielaard 34ba07
+	  if (! use_dynamic_segment && shdr != NULL)
Mark Wielaard 34ba07
 	    name = elf_strptr (ebl->elf, shdr->sh_link, dyn->d_un.d_val);
Mark Wielaard 34ba07
 	  else if (dyn->d_un.d_val < strtab_data->d_size
Mark Wielaard 34ba07
 		   && memrchr (strtab_data->d_buf + dyn->d_un.d_val, '\0',
Mark Wielaard 34ba07
Mark Wielaard 34ba07
commit b0a0235771906e3bcd6174c4e3c020b5522b0be5
Mark Wielaard 34ba07
Author: Mark Wielaard <mark@klomp.org>
Mark Wielaard 34ba07
Date:   Thu Nov 3 13:44:35 2022 +0100
Mark Wielaard 34ba07
Mark Wielaard 34ba07
    libdw: Don't dereference and assign values we are skipping
Mark Wielaard 34ba07
    
Mark Wielaard 34ba07
    We don't use the FDE address encoding byte, so no reason
Mark Wielaard 34ba07
    to read and store it. Just skip past it.
Mark Wielaard 34ba07
    
Mark Wielaard 34ba07
    Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard 34ba07
Mark Wielaard 34ba07
diff --git a/libdw/dwarf_next_cfi.c b/libdw/dwarf_next_cfi.c
Mark Wielaard 34ba07
index 23b16885..be08984f 100644
Mark Wielaard 34ba07
--- a/libdw/dwarf_next_cfi.c
Mark Wielaard 34ba07
+++ b/libdw/dwarf_next_cfi.c
Mark Wielaard 34ba07
@@ -226,7 +226,7 @@ dwarf_next_cfi (const unsigned char e_ident[],
Mark Wielaard 34ba07
 	      if (sized_augmentation)
Mark Wielaard 34ba07
 		{
Mark Wielaard 34ba07
 		  /* Skip FDE address encoding byte.  */
Mark Wielaard 34ba07
-		  encoding = *bytes++;
Mark Wielaard 34ba07
+		  bytes++;
Mark Wielaard 34ba07
 		  continue;
Mark Wielaard 34ba07
 		}
Mark Wielaard 34ba07
 	      break;
Mark Wielaard 34ba07
Mark Wielaard 34ba07
commit 52a6a3110e019d696284fdd822c2a2f0987dded2
Mark Wielaard 34ba07
Author: Mark Wielaard <mark@klomp.org>
Mark Wielaard 34ba07
Date:   Thu Nov 3 13:52:32 2022 +0100
Mark Wielaard 34ba07
Mark Wielaard 34ba07
    readelf: Check gelf_getdyn doesn't return NULL
Mark Wielaard 34ba07
    
Mark Wielaard 34ba07
    Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard 34ba07
Mark Wielaard 34ba07
diff --git a/src/readelf.c b/src/readelf.c
Mark Wielaard 34ba07
index e721a209..3dafb041 100644
Mark Wielaard 34ba07
--- a/src/readelf.c
Mark Wielaard 34ba07
+++ b/src/readelf.c
Mark Wielaard 34ba07
@@ -4910,7 +4910,7 @@ get_dynscn_addrs(Elf *elf, GElf_Phdr *phdr, GElf_Addr addrs[i_max])
Mark Wielaard 34ba07
     GElf_Dyn dyn_mem;
Mark Wielaard 34ba07
     GElf_Dyn *dyn = gelf_getdyn(data, dyn_idx, &dyn_mem);
Mark Wielaard 34ba07
     /* DT_NULL Marks end of dynamic section.  */
Mark Wielaard 34ba07
-    if (dyn->d_tag == DT_NULL)
Mark Wielaard 34ba07
+    if (dyn == NULL || dyn->d_tag == DT_NULL)
Mark Wielaard 34ba07
       break;
Mark Wielaard 34ba07
 
Mark Wielaard 34ba07
     switch (dyn->d_tag) {