diff options
author | Nick Clifton <nickc@redhat.com> | 2015-06-15 09:25:26 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-06-15 09:25:26 +0100 |
commit | a2a4d60d831e40350d96edd2f1cd55f430d04fd4 (patch) | |
tree | 25a87d9bdb0f892f8499417bdbe490aea3054a4a /ld/emultempl | |
parent | d025d5e5b57fb59c56aa4d57b7fc138720a8e454 (diff) | |
download | fsf-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.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/pe.em | 11 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 11 |
2 files changed, 20 insertions, 2 deletions
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); |