diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2014-02-04 20:17:16 +0100 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2014-02-04 20:17:16 +0100 |
commit | 2915c55b41d00f12ed6bc54b4160e3367065c1c8 (patch) | |
tree | e14debda024e41d5fc7ec74415ae1304a747d7e5 | |
parent | 591a12a1d4c8843343eb999145d8bcc1efedf408 (diff) | |
download | gdb-2915c55b41d00f12ed6bc54b4160e3367065c1c8.zip gdb-2915c55b41d00f12ed6bc54b4160e3367065c1c8.tar.gz gdb-2915c55b41d00f12ed6bc54b4160e3367065c1c8.tar.bz2 |
Fix PowerPC targets minor memory leaks found by Coverity
bfd/
2014-02-04 Jan Kratochvil <jan.kratochvil@redhat.com>
* coff-rs6000.c (xcoff_write_archive_contents_big): Free OFFSETS in
return paths. Three times.
* elf64-ppc.c (ppc64_elf_link_hash_table_create): Free HTAB in all
return paths.
(ppc64_elf_tls_optimize): Free TOC_REF in return path.
(ppc64_elf_edit_toc): Free USED in return path.
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/coff-rs6000.c | 15 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 28 |
3 files changed, 44 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b5d658b..e7ed98f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2014-02-04 Jan Kratochvil <jan.kratochvil@redhat.com> + + * coff-rs6000.c (xcoff_write_archive_contents_big): Free OFFSETS in + return paths. Three times. + * elf64-ppc.c (ppc64_elf_link_hash_table_create): Free HTAB in all + return paths. + (ppc64_elf_tls_optimize): Free TOC_REF in return path. + (ppc64_elf_edit_toc): Free USED in return path. + 2014-02-03 Sandra Loosemore <sandra@codesourcery.com> * reloc.c (BFD_RELOC_NIOS2_GOT_LO, BFD_RELOC_NIOS2_GOT_HA): New. diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 1170c7f..2b5f952 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -2404,7 +2404,10 @@ xcoff_write_archive_contents_big (bfd *abfd) PRINT20 (ahdrp->nextoff, iterator.next.offset); if (!do_pad (abfd, iterator.current.leading_padding)) - return FALSE; + { + free (offsets); + return FALSE; + } BFD_ASSERT (iterator.current.offset == bfd_tell (abfd)); namlen = iterator.current.padded_namlen; @@ -2414,7 +2417,10 @@ xcoff_write_archive_contents_big (bfd *abfd) || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0 || !do_copy (abfd, iterator.current.member) || !do_pad (abfd, iterator.current.trailing_padding)) - return FALSE; + { + free (offsets); + return FALSE; + } offsets[i] = iterator.current.offset; prevoff = iterator.current.offset; @@ -2459,7 +2465,10 @@ xcoff_write_archive_contents_big (bfd *abfd) member_table_size += member_table_size & 1; member_table = bfd_zmalloc (member_table_size); if (member_table == NULL) - return FALSE; + { + free (offsets); + return FALSE; + } hdr = (struct xcoff_ar_hdr_big *) member_table; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index c97a39e..9be8bfc 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -4168,19 +4168,31 @@ ppc64_elf_link_hash_table_create (bfd *abfd) /* Init the stub hash table too. */ if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc, sizeof (struct ppc_stub_hash_entry))) - return NULL; + { + _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab); + return NULL; + } /* And the branch hash table. */ if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc, sizeof (struct ppc_branch_hash_entry))) - return NULL; + { + bfd_hash_table_free (&htab->stub_hash_table); + _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab); + return NULL; + } htab->tocsave_htab = htab_try_create (1024, tocsave_htab_hash, tocsave_htab_eq, NULL); if (htab->tocsave_htab == NULL) - return NULL; + { + bfd_hash_table_free (&htab->branch_hash_table); + bfd_hash_table_free (&htab->stub_hash_table); + _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab); + return NULL; + } /* Initializing two fields of the union is just cosmetic. We really only care about glist, but when compiled on a 32-bit host the @@ -8073,7 +8085,10 @@ ppc64_elf_tls_optimize (struct bfd_link_info *info) relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, info->keep_memory); if (relstart == NULL) - return FALSE; + { + free (toc_ref); + return FALSE; + } relend = relstart + sec->reloc_count; for (rel = relstart; rel < relend; rel++) @@ -8781,7 +8796,10 @@ ppc64_elf_edit_toc (struct bfd_link_info *info) relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, info->keep_memory); if (relstart == NULL) - goto error_ret; + { + free (used); + goto error_ret; + } /* Mark toc entries referenced as used. */ do |