aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-06-15 09:25:26 +0100
committerNick Clifton <nickc@redhat.com>2015-06-15 09:25:26 +0100
commita2a4d60d831e40350d96edd2f1cd55f430d04fd4 (patch)
tree25a87d9bdb0f892f8499417bdbe490aea3054a4a
parentd025d5e5b57fb59c56aa4d57b7fc138720a8e454 (diff)
downloadfsf-binutils-gdb-a2a4d60d831e40350d96edd2f1cd55f430d04fd4.zip
fsf-binutils-gdb-a2a4d60d831e40350d96edd2f1cd55f430d04fd4.tar.gz
fsf-binutils-gdb-a2a4d60d831e40350d96edd2f1cd55f430d04fd4.tar.bz2
Fix a segmentation fault triggered when trying to handle an unresolved PE symbol with a very long name.
PR ld/18466 * emultempl/pe.em (pe_find_data_imports): Generate an error if a symbol name is too long to handle. * emultempl/pep.em (pep_find_data_imports): Likewise.
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/emultempl/pe.em11
-rw-r--r--ld/emultempl/pep.em11
3 files changed, 27 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index a12e5c9..38dbb8b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2015-06-15 Nick Clifton <nickc@redhat.com>
+
+ PR ld/18466
+ * emultempl/pe.em (pe_find_data_imports): Generate an error if a
+ symbol name is too long to handle.
+ * emultempl/pep.em (pep_find_data_imports): Likewise.
+
2015-06-12 Tristan Gingold <gingold@adacore.com>
* NEWS: Mention new option.
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 60882ce..0a5dcbf 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -1171,11 +1171,20 @@ pe_find_data_imports (void)
if (undef->type == bfd_link_hash_undefined)
{
/* C++ symbols are *long*. */
- char buf[4096];
+#define BUF_SIZE 4096
+ char buf[BUF_SIZE];
if (pe_dll_extra_pe_debug)
printf ("%s:%s\n", __FUNCTION__, undef->root.string);
+ if (strlen (undef->root.string) > (BUF_SIZE - 6))
+ {
+ /* PR linker/18466. */
+ einfo (_("%P: internal error: symbol too long: %s\n"),
+ undef->root.string);
+ return;
+ }
+
sprintf (buf, "__imp_%s", undef->root.string);
sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index d6de792..bf36276 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -1151,11 +1151,20 @@ pep_find_data_imports (void)
if (undef->type == bfd_link_hash_undefined)
{
/* C++ symbols are *long*. */
- char buf[4096];
+#define BUF_SIZE 4096
+ char buf[BUF_SIZE];
if (pep_dll_extra_pe_debug)
printf ("%s:%s\n", __FUNCTION__, undef->root.string);
+ if (strlen (undef->root.string) > (BUF_SIZE - 6))
+ {
+ /* PR linker/18466. */
+ einfo (_("%P: internal error: symbol too long: %s\n"),
+ undef->root.string);
+ return;
+ }
+
sprintf (buf, "__imp_%s", undef->root.string);
sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);