diff options
author | Alan Modra <amodra@gmail.com> | 2022-08-16 00:16:49 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-08-16 00:25:10 +0930 |
commit | 450da4bd38ae529a6879baafe59b1e88507b5fd9 (patch) | |
tree | 7f7794e1b3bff3b9466a127cc10e296b6c9eeec3 /binutils/dwarf.c | |
parent | 105afa7f230e5fed8f5a2eb28bc14d7696f5ac72 (diff) | |
download | binutils-450da4bd38ae529a6879baafe59b1e88507b5fd9.zip binutils-450da4bd38ae529a6879baafe59b1e88507b5fd9.tar.gz binutils-450da4bd38ae529a6879baafe59b1e88507b5fd9.tar.bz2 |
PR29362, some binutils memory leaks
2022-08-16 Alan Modra <amodra@gmail.com>
Cunlong Li <shenxiaogll@163.com>
PR 29362
* dwarf.c (free_debug_information): New function, extracted..
(free_debug_memory): ..from here.
(process_debug_info): Use it when before clearing out unit
debug_information. Clear all fields.
* objcopy.c (delete_symbol_htabs): New function.
(main): Call it via xatexit.
(copy_archive): Free "dir".
* objdump.c (free_debug_section): Free reloc_info.
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r-- | binutils/dwarf.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 0922097..71d8bc9 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -3509,6 +3509,21 @@ introduce (struct dwarf_section * section, bool raw) } } +/* Free memory allocated for one unit in debug_information. */ + +static void +free_debug_information (debug_info *ent) +{ + if (ent->max_loc_offsets) + { + free (ent->loc_offsets); + free (ent->loc_views); + free (ent->have_frame_base); + } + if (ent->max_range_lists) + free (ent->range_lists); +} + /* Process the contents of a .debug_info section. If do_loc is TRUE then we are scanning for location lists and dwo tags and we do not want to display anything to the user. @@ -3805,25 +3820,14 @@ process_debug_info (struct dwarf_section * section, && alloc_num_debug_info_entries > unit && ! do_types) { - debug_information [unit].cu_offset = cu_offset; - debug_information [unit].pointer_size - = compunit.cu_pointer_size; - debug_information [unit].offset_size = offset_size; - debug_information [unit].dwarf_version = compunit.cu_version; - debug_information [unit].base_address = 0; - debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE; - debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE; - debug_information [unit].rnglists_base = 0; - debug_information [unit].loc_offsets = NULL; - debug_information [unit].have_frame_base = NULL; - debug_information [unit].max_loc_offsets = 0; - debug_information [unit].num_loc_offsets = 0; - debug_information [unit].loclists_base = 0; - debug_information [unit].range_lists = NULL; - debug_information [unit].max_range_lists= 0; - debug_information [unit].num_range_lists = 0; - debug_information [unit].rnglists_base = 0; - debug_information [unit].str_offsets_base = 0; + free_debug_information (&debug_information[unit]); + memset (&debug_information[unit], 0, sizeof (*debug_information)); + debug_information[unit].pointer_size = compunit.cu_pointer_size; + debug_information[unit].offset_size = offset_size; + debug_information[unit].dwarf_version = compunit.cu_version; + debug_information[unit].cu_offset = cu_offset; + debug_information[unit].addr_base = DEBUG_INFO_UNAVAILABLE; + debug_information[unit].ranges_base = DEBUG_INFO_UNAVAILABLE; } if (!do_loc && dwarf_start_die == 0) @@ -12021,15 +12025,7 @@ free_debug_memory (void) if (debug_information != NULL) { for (i = 0; i < alloc_num_debug_info_entries; i++) - { - 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 (&debug_information[i]); free (debug_information); debug_information = NULL; alloc_num_debug_info_entries = num_debug_info_entries = 0; |