dwarf-reader: fix undefined behaviour in get_binary_load_address
authorMatthias Maennich <maennich@google.com>
Thu, 18 Apr 2019 09:33:34 +0000 (11:33 +0200)
committerDodji Seketeli <dodji@redhat.com>
Thu, 18 Apr 2019 09:33:34 +0000 (11:33 +0200)
Within the loop, the call `gelf_getphdr(elf_handle, i, &ph_mem)` is
returning a pointer to `ph_mem` that is only valid in this loop
iteration. The later assignment to *lowest_program_header and its
eventual use to assign load_address leads to undefined behaviour.

* src/abg-dwarf-reader.cc (get_binary_load_address): Move the
ph_mem and program_header variables out of the inner for-loop.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
src/abg-dwarf-reader.cc

index e0638c9..1815034 100644 (file)
@@ -1104,12 +1104,12 @@ get_binary_load_address(Elf *elf_handle,
   GElf_Ehdr eh_mem;
   GElf_Ehdr *elf_header = gelf_getehdr(elf_handle, &eh_mem);
   size_t num_segments = elf_header->e_phnum;
-  GElf_Phdr *lowest_program_header = 0;
+  GElf_Phdr *lowest_program_header = 0, *program_header = 0;
+  GElf_Phdr ph_mem;
 
   for (unsigned i = 0; i < num_segments; ++i)
     {
-      GElf_Phdr ph_mem;
-      GElf_Phdr *program_header = gelf_getphdr(elf_handle, i, &ph_mem);
+      program_header = gelf_getphdr(elf_handle, i, &ph_mem);
       if (program_header->p_type == PT_LOAD
          && (!lowest_program_header
              || program_header->p_vaddr < lowest_program_header->p_vaddr))