From 03db625c1387940624fcb0ca6be56eaed6ccf192 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 11 Apr 2019 23:11:33 +0000 Subject: [PATCH] llvm-undname: Fix out-of-bounds read on invalid intrinsic function code Found by inspection. llvm-svn: 358239 --- llvm/include/llvm/Demangle/MicrosoftDemangle.h | 2 ++ llvm/lib/Demangle/MicrosoftDemangle.cpp | 12 +++++++++--- llvm/test/Demangle/invalid-manglings.test | 5 +++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Demangle/MicrosoftDemangle.h b/llvm/include/llvm/Demangle/MicrosoftDemangle.h index 66553b4b2503..442c41d6fd36 100644 --- a/llvm/include/llvm/Demangle/MicrosoftDemangle.h +++ b/llvm/include/llvm/Demangle/MicrosoftDemangle.h @@ -207,6 +207,8 @@ private: NamedIdentifierNode *demangleBackRefName(StringView &MangledName); IdentifierNode *demangleTemplateInstantiationName(StringView &MangledName, NameBackrefBehavior NBB); + IntrinsicFunctionKind + translateIntrinsicFunctionCode(char CH, FunctionIdentifierCodeGroup Group); IdentifierNode *demangleFunctionIdentifierCode(StringView &MangledName); IdentifierNode * demangleFunctionIdentifierCode(StringView &MangledName, diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index c4559ccb5e23..0c3602a4a4c0 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -511,12 +511,18 @@ Demangler::demangleLiteralOperatorIdentifier(StringView &MangledName) { return N; } -static IntrinsicFunctionKind -translateIntrinsicFunctionCode(char CH, FunctionIdentifierCodeGroup Group) { +IntrinsicFunctionKind +Demangler::translateIntrinsicFunctionCode(char CH, + FunctionIdentifierCodeGroup Group) { + using IFK = IntrinsicFunctionKind; + if (!(CH >= '0' && CH <= '9') && !(CH >= 'A' && CH <= 'Z')) { + Error = true; + return IFK::None; + } + // Not all ? identifiers are intrinsics *functions*. This function only maps // operator codes for the special functions, all others are handled elsewhere, // hence the IFK::None entries in the table. - using IFK = IntrinsicFunctionKind; static IFK Basic[36] = { IFK::None, // ?0 # Foo::Foo() IFK::None, // ?1 # Foo::~Foo() diff --git a/llvm/test/Demangle/invalid-manglings.test b/llvm/test/Demangle/invalid-manglings.test index 839218ad1019..473b3e4bbe15 100644 --- a/llvm/test/Demangle/invalid-manglings.test +++ b/llvm/test/Demangle/invalid-manglings.test @@ -109,3 +109,8 @@ ; CHECK-EMPTY: ; CHECK-NEXT: ?x@@3PAW ; CHECK-NEXT: error: Invalid mangled name + +??} +; CHECK-EMPTY: +; CHECK-NEXT: ??} +; CHECK-NEXT: error: Invalid mangled name