GCC10 -fanalyzer found a possibly-NULL dereference after a failed
malloc in __libdw_alloc_tail. In this case we should call the Dwarf
oom_handler as is done in other places where an essential malloc
call fails. The oom_handler cannot return and will likely just abort.

Signed-off-by: Mark Wielaard <m...@klomp.org>
---
 libdw/ChangeLog     | 5 +++++
 libdw/libdw_alloc.c | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 39730fbc..75fc8f06 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-25  Mark Wielaard  <m...@klomp.org>
+
+       * libdw_alloc.c (__libdw_alloc_tail): Call Dwarf oom_handler()
+       when malloc fails.
+
 2020-04-17  Mark Wielaard  <m...@klomp.org>
 
        * dwarf_begin_elf.c (check_section): Handle .gnu.debuglto_ prefix.
diff --git a/libdw/libdw_alloc.c b/libdw/libdw_alloc.c
index e0281a3d..b3e53343 100644
--- a/libdw/libdw_alloc.c
+++ b/libdw/libdw_alloc.c
@@ -87,6 +87,11 @@ __libdw_alloc_tail (Dwarf *dbg)
   if (result == NULL)
     {
       result = malloc (dbg->mem_default_size);
+      if (result == NULL)
+       {
+         pthread_rwlock_unlock (&dbg->mem_rwl);
+         dbg->oom_handler();
+       }
       result->size = dbg->mem_default_size
                      - offsetof (struct libdw_memblock, mem);
       result->remaining = result->size;
-- 
2.18.2

Reply via email to