diff options
author | Alan Modra <amodra@gmail.com> | 2019-12-29 12:55:20 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-12-29 21:26:00 +1030 |
commit | f5d35bb7a5789950efd5f03b270d4c5f774eaba9 (patch) | |
tree | 4e4b63370ff2c7c49a471587238d24a79b38cc83 | |
parent | a6e5765ff1c5fdebaf4953eed619a717178cc7e6 (diff) | |
download | gdb-f5d35bb7a5789950efd5f03b270d4c5f774eaba9.zip gdb-f5d35bb7a5789950efd5f03b270d4c5f774eaba9.tar.gz gdb-f5d35bb7a5789950efd5f03b270d4c5f774eaba9.tar.bz2 |
coff_close_and_cleanup
Fixes leaks in _bfd_coff_get_external_symbols and
_bfd_coff_read_string_table.
* coffcode.h (coff_close_and_cleanup): Redefine to..
* coffgen.c (_bfd_coff_close_and_cleanup): ..this. New function.
* libcoff-in.h (_bfd_coff_close_and_cleanup): Declare.
* libcoff.h: Regenerate.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/coffcode.h | 2 | ||||
-rw-r--r-- | bfd/coffgen.c | 15 | ||||
-rw-r--r-- | bfd/libcoff-in.h | 2 | ||||
-rw-r--r-- | bfd/libcoff.h | 2 |
5 files changed, 27 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index af2ddfa..de79b5e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2019-12-29 Alan Modra <amodra@gmail.com> + + * coffcode.h (coff_close_and_cleanup): Redefine to.. + * coffgen.c (_bfd_coff_close_and_cleanup): ..this. New function. + * libcoff-in.h (_bfd_coff_close_and_cleanup): Declare. + * libcoff.h: Regenerate. + 2019-12-29 Hannes Domani <ssbssa@yahoo.de> Alan Modra <amodra@gmail.com> diff --git a/bfd/coffcode.h b/bfd/coffcode.h index ac5312f..7bf7d68 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -5642,7 +5642,7 @@ static bfd_coff_backend_data bigobj_swap_table = #endif /* COFF_WITH_PE_BIGOBJ */ #ifndef coff_close_and_cleanup -#define coff_close_and_cleanup _bfd_generic_close_and_cleanup +#define coff_close_and_cleanup _bfd_coff_close_and_cleanup #endif #ifndef coff_bfd_free_cached_info diff --git a/bfd/coffgen.c b/bfd/coffgen.c index 7f26e18..57a18b0 100644 --- a/bfd/coffgen.c +++ b/bfd/coffgen.c @@ -3161,3 +3161,18 @@ bfd_coff_group_name (bfd *abfd, const asection *sec) return ci->name; return NULL; } + +bfd_boolean +_bfd_coff_close_and_cleanup (bfd *abfd) +{ + if (abfd->format == bfd_object + && bfd_family_coff (abfd) + && coff_data (abfd) != NULL) + { + obj_coff_keep_syms (abfd) = FALSE; + obj_coff_keep_strings (abfd) = FALSE; + if (!_bfd_coff_free_symbols (abfd)) + return FALSE; + } + return _bfd_generic_close_and_cleanup (abfd); +} diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h index 031622f..a4623dd 100644 --- a/bfd/libcoff-in.h +++ b/bfd/libcoff-in.h @@ -367,6 +367,8 @@ extern bfd_vma bfd_coff_reloc16_get_value (arelent *, struct bfd_link_info *, asection *); extern void bfd_perform_slip (bfd *, unsigned int, asection *, bfd_vma); +extern bfd_boolean _bfd_coff_close_and_cleanup + (bfd *); /* Functions and types in cofflink.c. */ diff --git a/bfd/libcoff.h b/bfd/libcoff.h index 093f1b4..e9cade8 100644 --- a/bfd/libcoff.h +++ b/bfd/libcoff.h @@ -371,6 +371,8 @@ extern bfd_vma bfd_coff_reloc16_get_value (arelent *, struct bfd_link_info *, asection *); extern void bfd_perform_slip (bfd *, unsigned int, asection *, bfd_vma); +extern bfd_boolean _bfd_coff_close_and_cleanup + (bfd *); /* Functions and types in cofflink.c. */ |