aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle/MicrosoftDemangle.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2019-04-19 14:13:11 +0000
committerNico Weber <nicolasweber@gmx.de>2019-04-19 14:13:11 +0000
commite145a540cc906c0ee0fd9e3ab2dc463a193eb91c (patch)
tree46d1467d95f0870493957bafeaff6a28c862e18a /llvm/lib/Demangle/MicrosoftDemangle.cpp
parent2c1f3ea538f254759b05ac3caac9592334026f3c (diff)
downloadllvm-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.cpp9
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;
}