summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-06-22 23:36:03 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-06-22 23:36:03 +0000
commit9e0d41ab092524e8af038ee35ad66f77714667cf (patch)
tree7dadc974dabc3ba07ea44e4ab9a947dfa39e6371 /llvm
parentc05dd074e7e61b3dba8086caf36ee9151a8c0a5d (diff)
downloadbcm5719-llvm-9e0d41ab092524e8af038ee35ad66f77714667cf.tar.gz
bcm5719-llvm-9e0d41ab092524e8af038ee35ad66f77714667cf.zip
Fix PR23914.
r226830 moved the declaration of Buf to a nested scope, resulting in a dangling reference (in StringRef Name), and a use-after-free. llvm-svn: 240357
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp2
-rw-r--r--llvm/test/MC/ELF/symver-pr23914.s16
2 files changed, 17 insertions, 1 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index e7f5265384b..064e1db4783 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -842,12 +842,12 @@ void ELFObjectWriter::computeSymbolTable(
// seems that this information is not easily accessible from the
// ELFObjectWriter.
StringRef Name = Symbol.getName();
+ SmallString<32> Buf;
if (!Name.startswith("?") && !Name.startswith("@?") &&
!Name.startswith("__imp_?") && !Name.startswith("__imp_@?")) {
// This symbol isn't following the MSVC C++ name mangling convention. We
// can thus safely interpret the @@@ in symbol names as specifying symbol
// versioning.
- SmallString<32> Buf;
size_t Pos = Name.find("@@@");
if (Pos != StringRef::npos) {
Buf += Name.substr(0, Pos);
diff --git a/llvm/test/MC/ELF/symver-pr23914.s b/llvm/test/MC/ELF/symver-pr23914.s
new file mode 100644
index 00000000000..e8b43251010
--- /dev/null
+++ b/llvm/test/MC/ELF/symver-pr23914.s
@@ -0,0 +1,16 @@
+// Regression test for PR23914.
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r -t | FileCheck %s
+
+defined:
+ .symver defined, aaaaaaaaaaaaaaaaaa@@@AAAAAAAAAAAAA
+
+// CHECK: Symbol {
+// CHECK: Name: aaaaaaaaaaaaaaaaaa@@AAAAAAAAAAAAA
+// CHECK-NEXT: Value: 0x0
+// CHECK-NEXT: Size: 0
+// CHECK-NEXT: Binding: Local
+// CHECK-NEXT: Type: None
+// CHECK-NEXT: Other: 0
+// CHECK-NEXT: Section: .text
+// CHECK-NEXT: }
+
OpenPOWER on IntegriCloud