https://sourceware.org/bugzilla/show_bug.cgi?id=32655

Mark Wielaard <mark at klomp dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
           Assignee|unassigned at sourceware dot org   |mark at klomp dot org
                 CC|                            |mark at klomp dot org
   Last reconfirmed|                            |2025-02-08
     Ever confirmed|0                           |1

--- Comment #1 from Mark Wielaard <mark at klomp dot org> ---
Replicated with valgrind and eu-readelf --sym -D

==726277== Invalid read of size 4
==726277==    at 0x409C85: handle_dynamic_symtab (readelf.c:2914)
==726277==    by 0x408DBC: print_symtab (readelf.c:2581)
==726277==    by 0x404543: process_elf_file (readelf.c:1064)
==726277==    by 0x403C06: process_dwflmod (readelf.c:840)
==726277==    by 0x48BD942: dwfl_getmodules (dwfl_getmodules.c:86)
==726277==    by 0x40403A: process_file (readelf.c:948)
==726277==    by 0x402B55: main (readelf.c:417)
==726277==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

This simply doesn't check that there is a valid phdr after calling
elf_gelfphdr.

Solution is adding a simple check:

diff --git a/src/readelf.c b/src/readelf.c
index 3991cda81df2..986ceb4b315a 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -2911,7 +2911,7 @@ handle_dynamic_symtab (Ebl *ebl)
   for (size_t i = 0; i < phnum; ++i)
     {
       phdr = gelf_getphdr (ebl->elf, i, &phdr_mem);
-      if (phdr->p_type == PT_DYNAMIC)
+      if (phdr == NULL || phdr->p_type == PT_DYNAMIC)
        break;
     }
   if (phdr == NULL)

Also introduced when -D/--dynamic support was added in commit 4d8de4b2fa05
("readelf: display dynamic symtab without section headers")

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to