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.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240357 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evgeniy Stepanov 2015-06-22 23:36:03 +00:00
parent 3755f9f48c
commit 845d1a6a17
2 changed files with 17 additions and 1 deletions

View File

@ -842,12 +842,12 @@ void ELFObjectWriter::computeSymbolTable(
// seems that this information is not easily accessible from the // seems that this information is not easily accessible from the
// ELFObjectWriter. // ELFObjectWriter.
StringRef Name = Symbol.getName(); StringRef Name = Symbol.getName();
SmallString<32> Buf;
if (!Name.startswith("?") && !Name.startswith("@?") && if (!Name.startswith("?") && !Name.startswith("@?") &&
!Name.startswith("__imp_?") && !Name.startswith("__imp_@?")) { !Name.startswith("__imp_?") && !Name.startswith("__imp_@?")) {
// This symbol isn't following the MSVC C++ name mangling convention. We // This symbol isn't following the MSVC C++ name mangling convention. We
// can thus safely interpret the @@@ in symbol names as specifying symbol // can thus safely interpret the @@@ in symbol names as specifying symbol
// versioning. // versioning.
SmallString<32> Buf;
size_t Pos = Name.find("@@@"); size_t Pos = Name.find("@@@");
if (Pos != StringRef::npos) { if (Pos != StringRef::npos) {
Buf += Name.substr(0, Pos); Buf += Name.substr(0, Pos);

View File

@ -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: }