aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-12-29 12:55:20 +1030
committerAlan Modra <amodra@gmail.com>2019-12-29 21:26:00 +1030
commitf5d35bb7a5789950efd5f03b270d4c5f774eaba9 (patch)
tree4e4b63370ff2c7c49a471587238d24a79b38cc83
parenta6e5765ff1c5fdebaf4953eed619a717178cc7e6 (diff)
downloadgdb-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/ChangeLog7
-rw-r--r--bfd/coffcode.h2
-rw-r--r--bfd/coffgen.c15
-rw-r--r--bfd/libcoff-in.h2
-rw-r--r--bfd/libcoff.h2
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. */