Skip to content

Commit

Permalink
Fix mmo memory leaks
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
amodra committed Feb 10, 2023
1 parent fe8cdc8 commit 80aa664
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions bfd/mmo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 80aa664

Please sign in to comment.