]> granicus.if.org Git - llvm/commitdiff
llvm-undname: Fix an assert-on-invalid, found by oss-fuzz
authorNico Weber <nicolasweber@gmx.de>
Wed, 22 May 2019 15:53:23 +0000 (15:53 +0000)
committerNico Weber <nicolasweber@gmx.de>
Wed, 22 May 2019 15:53:23 +0000 (15:53 +0000)
If a template parameter refers to a pointer to member, but the mangling
of that was a string literal instead of a real symbol, llvm-undname used
to crash instead of rejecting the input.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361402 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Demangle/MicrosoftDemangle.cpp
test/Demangle/invalid-manglings.test

index 4942e0e3655e51326182e327e4647ded6e59ad17..041d327596b48ed2efd42a62b97531a0f889b0ac 100644 (file)
@@ -2175,8 +2175,10 @@ Demangler::demangleTemplateParameterList(StringView &MangledName) {
       SymbolNode *S = nullptr;
       if (MangledName.startsWith('?')) {
         S = parse(MangledName);
-        if (Error)
+        if (Error || !S->Name) {
+          Error = true;
           return nullptr;
+        }
         memorizeIdentifier(S->Name->getUnqualifiedIdentifier());
       }
 
index d64ec4f14d48efcc9b658bcdab171419d8c6bde9..6cd025a1eeca0c4fc552a5202e0d1785add3ce3c 100644 (file)
 ; CHECK-EMPTY:
 ; CHECK-NEXT: ??_C@_12@?z
 ; CHECK-NEXT: error: Invalid mangled name
+
+??$foo@$1??_C@_02PCEFGMJL@hi?$AA@@
+; CHECK-EMPTY:
+; CHECK-NEXT: ??$foo@$1??_C@_02PCEFGMJL@hi?$AA@@
+; CHECK-NEXT: error: Invalid mangled name