+2020-08-14 Alan Modra <amodra@gmail.com>
+
+ 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 <amodra@gmail.com>
* testsuite/binutils-all/mangled.s: Use dc.a rather than dc.d.
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;
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;
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
&& symcount > 0)
{
if (! parse_coff (abfd, syms, symcount, dhandle))
- return NULL;
+ goto err_exit;
found = TRUE;
}
if (! no_messages)
non_fatal (_("%s: no recognized debugging information"),
bfd_get_filename (abfd));
+ err_exit:
+ free (dhandle);
return NULL;
}