aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2017-11-01 11:35:42 +0000
committerNick Clifton <nickc@redhat.com>2017-11-01 11:35:42 +0000
commitee357486aa87b17782111295c5e7bd4ac9e6970f (patch)
tree26750ac53e7ea4c06e31a9230d11fce21678126f /bfd
parent4070243b5c1f66a36dd43a7b722e991ac9fc40e1 (diff)
downloadgdb-ee357486aa87b17782111295c5e7bd4ac9e6970f.zip
gdb-ee357486aa87b17782111295c5e7bd4ac9e6970f.tar.gz
gdb-ee357486aa87b17782111295c5e7bd4ac9e6970f.tar.bz2
Fix an invalid free called when attempting to link a COFF object against an ELF archive with --no-keep-memory enabled.
PR 22369 * coffgen.c (_bfd_coff_free_symbols): Fail if called on a non-COFF file. * cofflink.c (coff_link_check_archive_element): Skip non-COFF members of an archive.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/coffgen.c6
-rw-r--r--bfd/cofflink.c4
3 files changed, 17 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index fca37c0..662ef44 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -7,6 +7,14 @@
Expand and move the non_got_ref comment.
* elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise.
+2017-11-01 Nick Clifton <nickc@redhat.com>
+
+ PR 22369
+ * coffgen.c (_bfd_coff_free_symbols): Fail if called on a non-COFF
+ file.
+ * cofflink.c (coff_link_check_archive_element): Skip non-COFF
+ members of an archive.
+
2017-10-31 Nick Clifton <nickc@redhat.com>
PR 22373
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index d7cdf8f..98363d0 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -1659,7 +1659,6 @@ _bfd_coff_get_external_symbols (bfd *abfd)
}
obj_coff_external_syms (abfd) = syms;
-
return TRUE;
}
@@ -1747,12 +1746,16 @@ _bfd_coff_read_string_table (bfd *abfd)
bfd_boolean
_bfd_coff_free_symbols (bfd *abfd)
{
+ if (! bfd_family_coff (abfd))
+ return FALSE;
+
if (obj_coff_external_syms (abfd) != NULL
&& ! obj_coff_keep_syms (abfd))
{
free (obj_coff_external_syms (abfd));
obj_coff_external_syms (abfd) = NULL;
}
+
if (obj_coff_strings (abfd) != NULL
&& ! obj_coff_keep_strings (abfd))
{
@@ -1760,6 +1763,7 @@ _bfd_coff_free_symbols (bfd *abfd)
obj_coff_strings (abfd) = NULL;
obj_coff_strings_len (abfd) = 0;
}
+
return TRUE;
}
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index 32d62bd..5b18e54 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -212,6 +212,10 @@ coff_link_check_archive_element (bfd *abfd,
if (h->type != bfd_link_hash_undefined)
return TRUE;
+ /* PR 22369 - Skip non COFF objects in the archive. */
+ if (! bfd_family_coff (abfd))
+ return TRUE;
+
/* Include this element? */
if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
return TRUE;