From: Alan Modra Date: Fri, 14 Aug 2020 10:49:39 +0000 (+0930) Subject: PR26388, objdump debug dump memory leaks X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=82fcdb39388c6690699d41b7022b054c2de2554c;p=binutils-gdb.git PR26388, objdump debug dump memory leaks num_debug_info_entries is used not just as a count but also as a flag (DEBUG_INFO_UNAVAILABLE) after some errors. That means num_debug_info_entries can't be used when cleaning up malloc'd info. PR 26388 * dwarf.c (free_debug_memory): Free alloc_num_debug_info_entries of debug_information. Correct test of max_loc_offsets and max_range_lists. * rddbg.c (read_debugging_info): Free dhandle on error. --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 223ffb09956..7a6479b008e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2020-08-14 Alan Modra + + PR 26388 + * dwarf.c (free_debug_memory): Free alloc_num_debug_info_entries + of debug_information. Correct test of max_loc_offsets and + max_range_lists. + * rddbg.c (read_debugging_info): Free dhandle on error. + 2020-08-14 Alan Modra * testsuite/binutils-all/mangled.s: Use dc.a rather than dc.d. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index d739230a28e..52759948718 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -10777,18 +10777,15 @@ free_debug_memory (void) if (debug_information != NULL) { - if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE) + for (i = 0; i < alloc_num_debug_info_entries; i++) { - for (i = 0; i < num_debug_info_entries; i++) + if (debug_information [i].max_loc_offsets) { - if (!debug_information [i].max_loc_offsets) - { - free (debug_information [i].loc_offsets); - free (debug_information [i].have_frame_base); - } - if (!debug_information [i].max_range_lists) - free (debug_information [i].range_lists); + free (debug_information [i].loc_offsets); + free (debug_information [i].have_frame_base); } + if (debug_information [i].max_range_lists) + free (debug_information [i].range_lists); } free (debug_information); debug_information = NULL; diff --git a/binutils/rddbg.c b/binutils/rddbg.c index 930dbf71349..f8ea2f99afa 100644 --- a/binutils/rddbg.c +++ b/binutils/rddbg.c @@ -43,7 +43,8 @@ static void free_saved_stabs (void); pointer. */ void * -read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_messages) +read_debugging_info (bfd *abfd, asymbol **syms, long symcount, + bfd_boolean no_messages) { void *dhandle; bfd_boolean found; @@ -54,13 +55,13 @@ read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_me if (! read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, &found)) - return NULL; + goto err_exit; if (bfd_get_flavour (abfd) == bfd_target_aout_flavour) { if (! read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, &found)) - return NULL; + goto err_exit; } /* Try reading the COFF symbols if we didn't find any stabs in COFF @@ -70,7 +71,7 @@ read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_me && symcount > 0) { if (! parse_coff (abfd, syms, symcount, dhandle)) - return NULL; + goto err_exit; found = TRUE; } @@ -79,6 +80,8 @@ read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_me if (! no_messages) non_fatal (_("%s: no recognized debugging information"), bfd_get_filename (abfd)); + err_exit: + free (dhandle); return NULL; }