diff options
author | Nico Weber <nicolasweber@gmx.de> | 2019-04-19 14:13:11 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2019-04-19 14:13:11 +0000 |
commit | e145a540cc906c0ee0fd9e3ab2dc463a193eb91c (patch) | |
tree | 46d1467d95f0870493957bafeaff6a28c862e18a /llvm/lib/Demangle/MicrosoftDemangle.cpp | |
parent | 2c1f3ea538f254759b05ac3caac9592334026f3c (diff) | |
download | llvm-e145a540cc906c0ee0fd9e3ab2dc463a193eb91c.zip llvm-e145a540cc906c0ee0fd9e3ab2dc463a193eb91c.tar.gz llvm-e145a540cc906c0ee0fd9e3ab2dc463a193eb91c.tar.bz2 |
llvm-undname: Attempt to fix leak-on-invalid found by oss-fuzz
llvm-svn: 358760
Diffstat (limited to 'llvm/lib/Demangle/MicrosoftDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index 3fb8e0e..ebe2ef5 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -1230,6 +1230,11 @@ Demangler::demangleStringLiteral(StringView &MangledName) { EncodedStringLiteralNode *Result = Arena.alloc<EncodedStringLiteralNode>(); + // Must happen before the first `goto StringLiteralError`. + if (!initializeOutputStream(nullptr, nullptr, OS, 1024)) + // FIXME: Propagate out-of-memory as an error? + std::terminate(); + // Prefix indicating the beginning of a string literal if (!MangledName.consumeFront("@_")) goto StringLiteralError; @@ -1261,9 +1266,6 @@ Demangler::demangleStringLiteral(StringView &MangledName) { if (MangledName.empty()) goto StringLiteralError; - if (!initializeOutputStream(nullptr, nullptr, OS, 1024)) - // FIXME: Propagate out-of-memory as an error? - std::terminate(); if (IsWcharT) { Result->Char = CharKind::Wchar; if (StringByteSize > 64) @@ -1328,6 +1330,7 @@ Demangler::demangleStringLiteral(StringView &MangledName) { StringLiteralError: Error = true; + std::free(OS.getBuffer()); return nullptr; } |