From e6e6cc83ea27413facb310ce48bebb1579a47130 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 14 Dec 2013 15:02:56 +0100 Subject: libdwfl: Fix various frame related memory leaks. The result of dwarf_cfi_addrframe should have been freed when done. Dwfl_Module cached the reloc_info and the eh_cfi it which also should have been released when disposing of the module. Reported-by: Masatake YAMATO Tested-by: Masatake YAMATO Signed-off-by: Mark Wielaard --- libdwfl/ChangeLog | 7 +++++++ libdwfl/dwfl_module.c | 6 ++++++ libdwfl/frame_unwind.c | 1 + 3 files changed, 14 insertions(+) diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index ff38108e..a9238d80 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,10 @@ +2013-12-14 Mark Wielaard + + * dwfl_module.c (__libdwfl_module_free): Free mod->reloc_info if + allocated. Call dwarf_cfi_end on mod->eh_cfi if necessary. + * frame_unwind.c (handle_cfi): Free frame result from + dwarf_cfi_addrframe when done. + 2013-12-15 Jan Kratochvil unwinder: ppc and ppc64 diff --git a/libdwfl/dwfl_module.c b/libdwfl/dwfl_module.c index f914b3a3..bb167ab2 100644 --- a/libdwfl/dwfl_module.c +++ b/libdwfl/dwfl_module.c @@ -84,6 +84,12 @@ __libdwfl_module_free (Dwfl_Module *mod) if (mod->build_id_bits != NULL) free (mod->build_id_bits); + if (mod->reloc_info != NULL) + free (mod->reloc_info); + + if (mod->eh_cfi != NULL) + dwarf_cfi_end (mod->eh_cfi); + free (mod->name); free (mod); } diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c index 2973f955..630efcb6 100644 --- a/libdwfl/frame_unwind.c +++ b/libdwfl/frame_unwind.c @@ -580,6 +580,7 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias) else unwound->pc_state = DWFL_FRAME_STATE_PC_SET; } + free (frame); } void -- cgit v1.2.3