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