aboutsummaryrefslogtreecommitdiff
path: root/bfd/mmo.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-02-10 20:08:40 +1030
committerAlan Modra <amodra@gmail.com>2023-02-10 20:30:24 +1030
commit80aa6647b1678fe84b5af5595ad939b48febf6a0 (patch)
treef402c2d4366c911184ad0f5c658c32b7f479c574 /bfd/mmo.c
parentfe8cdc8ec145a166414fc375cf2cb65d9a8085a1 (diff)
downloadgdb-80aa6647b1678fe84b5af5595ad939b48febf6a0.zip
gdb-80aa6647b1678fe84b5af5595ad939b48febf6a0.tar.gz
gdb-80aa6647b1678fe84b5af5595ad939b48febf6a0.tar.bz2
Fix mmo memory leaks
The main one here is the section buffer, which can be quite large. By using alloc rather than malloc we can leave tidying memory to the generic bfd code when the bfd is closed. bfd_check_format also releases memory when object_p fails, so while it wouldn't be wrong to bfd_release at bad_format_free in mmo_object_p, it's a little extra code and work for no gain. * mmo.c (mmo_object_p): bfd_alloc rather than bfd_malloc lop_stab_symbol. Don't free/release on error. (mmo_get_spec_section): bfd_zalloc rather than bfd_zmalloc section buffer. (mmo_scan): Free fname on another error path.
Diffstat (limited to 'bfd/mmo.c')
-rw-r--r--bfd/mmo.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/bfd/mmo.c b/bfd/mmo.c
index 6e21834..bbdaad3 100644
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -526,7 +526,7 @@ mmo_object_p (bfd *abfd)
important as all of the symbol information can only be 256k. */
abfd->tdata.mmo_data->max_symbol_length = (b[2] * 256 + b[3]) * 4;
abfd->tdata.mmo_data->lop_stab_symbol
- = bfd_malloc (abfd->tdata.mmo_data->max_symbol_length + 1);
+ = bfd_alloc (abfd, abfd->tdata.mmo_data->max_symbol_length + 1);
if (abfd->tdata.mmo_data->lop_stab_symbol == NULL)
{
@@ -539,7 +539,7 @@ mmo_object_p (bfd *abfd)
/* Read in everything. */
if (! mmo_scan (abfd))
- goto bad_format_free;
+ goto bad_format;
if (abfd->symcount > 0)
abfd->flags |= HAS_SYMS;
@@ -548,12 +548,10 @@ mmo_object_p (bfd *abfd)
arches (not recommended due to its small-size limitations). Look at
the ELF format for how to make it target-generic. */
if (! bfd_default_set_arch_mach (abfd, bfd_arch_mmix, 0))
- goto bad_format_free;
+ goto bad_format;
return _bfd_no_cleanup;
- bad_format_free:
- free (abfd->tdata.mmo_data->lop_stab_symbol);
bad_format:
bfd_set_error (bfd_error_wrong_format);
bad_final:
@@ -1128,8 +1126,8 @@ mmo_get_spec_section (bfd *abfd, int spec_data_number)
/* We allocate a buffer here for the advertised size, with head room for
tetrabyte alignment. */
- loc = bfd_zmalloc (section_length + 3
- + sizeof (struct mmo_data_list_struct));
+ loc = bfd_zalloc (abfd, (section_length + 3
+ + sizeof (struct mmo_data_list_struct)));
if (loc == NULL)
goto format_error;
@@ -1888,6 +1886,7 @@ mmo_scan (bfd *abfd)
" was already entered as `%s'\n"),
abfd, y, fname, file_names[y]);
bfd_set_error (bfd_error_bad_value);
+ free (fname);
goto error_return;
}