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