patch for memory leak in libbfd
Dorr H. Clark
dclark at engr.scu.edu
Wed Oct 8 06:21:35 UTC 2008
While working with the version of libbfd which ships with FreeBSD 6.3,
we found a memory leak. The memory leak is fixed in a more recent
version of libbfd, but some people may not want to upgrade.
For this reason, we have back-ported a patch to libbfd
to address the memory leak in the shipping version.
Patch follows.
Sunitha Nagendra
Engineer
Dorr H. Clark
Advisor
Graduate School of Engineering
Santa Clara University
Santa Clara, CA.
http://www.cse.scu.edu/~dclark/coen_284_FreeBSD/libbfd_patch.txt
contrib/binutils/bfd/dwarf2.c
491,498c491,516
< if ((cur_abbrev->num_attrs % ATTR_ALLOC_CHUNK) == 0)
< {
< amt = cur_abbrev->num_attrs + ATTR_ALLOC_CHUNK;
< amt *= sizeof (struct attr_abbrev);
< cur_abbrev->attrs = bfd_realloc (cur_abbrev->attrs, amt);
< if (! cur_abbrev->attrs)
< return 0;
< }
---
>
> if ((cur_abbrev->num_attrs % ATTR_ALLOC_CHUNK) == 0)
> {
> struct attr_abbrev *tmp;
>
> amt = cur_abbrev->num_attrs + ATTR_ALLOC_CHUNK;
> amt *= sizeof (struct attr_abbrev);
> tmp = bfd_realloc (cur_abbrev->attrs, amt);
> if (tmp == NULL)
> {
> size_t i;
>
> for (i = 0; i < ABBREV_HASH_SIZE; i++)
> {
> struct abbrev_info *abbrev = abbrevs[i];
>
> while (abbrev)
> {
> free (abbrev->attrs);
> abbrev = abbrev->next;
> }
> }
> return NULL;
> }
> cur_abbrev->attrs = tmp;
> }
1876a1895,1936
>
> void
> _bfd_dwarf2_cleanup_debug_info (bfd *abfd)
> {
> struct comp_unit *each;
> struct dwarf2_debug *stash;
>
> if (abfd == NULL || elf_tdata (abfd) == NULL)
> return;
>
> stash = elf_tdata (abfd)->dwarf2_find_line_info;
>
> if (stash == NULL)
> return;
>
> for (each = stash->all_comp_units; each; each = each->next_unit)
> {
> struct abbrev_info **abbrevs = each->abbrevs;
> size_t i;
>
> for (i = 0; i < ABBREV_HASH_SIZE; i++)
> {
> struct abbrev_info *abbrev = abbrevs[i];
>
> while (abbrev)
> {
> free (abbrev->attrs);
> abbrev = abbrev->next;
> }
> }
>
> if (each->line_table)
> {
> free (each->line_table->dirs);
> free (each->line_table->files);
> }
> }
>
> free (stash->dwarf_abbrev_buffer);
> free (stash->dwarf_line_buffer);
> }
>
contrib/binutils/bfd/elf-bfd.h
1639a1640,1643
>
> extern void _bfd_dwarf2_cleanup_debug_info
> (bfd *);
>
contrib/binutils/bfd/elf.c
6291a6292
> _bfd_dwarf2_cleanup_debug_info (abfd);
More information about the freebsd-ports-bugs
mailing list