From bf9245d54f05dc12c3eb290e5047374876ba6072 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Tue, 10 Nov 2020 17:23:11 -0500 Subject: [PATCH] GP-272 - Gnu Demangler - fixed demangler failure on function parameter that has more than 2 sets of parentheses --- .../demangler/gnu/GnuDemanglerParser.java | 2 +- .../demangler/GnuDemanglerParserTest.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java index c04666bf1c..6c44813195 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java @@ -755,7 +755,7 @@ public class GnuDemanglerParser { else { int startParenCount = StringUtilities.countOccurrences(datatype.substring(i), '('); - boolean hasPointerParens = startParenCount == 2; + boolean hasPointerParens = startParenCount >= 2; if (hasPointerParens) { Demangled namespace = ddt.getNamespace(); DemangledFunctionPointer dfp = parseFunctionPointer(datatype); diff --git a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java index 9ebc143f9f..81573e9211 100644 --- a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java +++ b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java @@ -1540,6 +1540,37 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { signature); } + @Test + public void testFunctionParameterWithMultipleParentheses() throws Exception { + + // + // Mangled: __ZN7WebCore12TextCodecICU14registerCodecsEPFvPKcON3WTF8FunctionIFNSt3__110unique_ptrINS_9TextCodecENS5_14default_deleteIS7_EEEEvEEEE + // + // Demangled: undefined WebCore::TextCodecICU::registerCodecs(void ()(char const *,WTF::Function> ()> &&)) + // + // The regression tested here revolves around this parameter: + // + // void ()(char const *,WTF::Function> ()> && + // + // (note the trailing '()' chars) + // + + DemangledObject object = parser.parse( + "__ZN7WebCore12TextCodecICU14registerCodecsEPFvPKcON3WTF8FunctionIFNSt3__110unique_ptrINS_9TextCodecENS5_14default_deleteIS7_EEEEvEEEE", + "undefined WebCore::TextCodecICU::registerCodecs(void ()(char const *,WTF::Function> ()> &&))"); + + assertNotNull(object); + assertType(object, DemangledFunction.class); + + String name = "registerCodecs"; + assertName(object, name, "WebCore", "TextCodecICU"); + + String signature = object.getSignature(false); + assertEquals( + "undefined WebCore::TextCodecICU::registerCodecs(void ()(char const *,WTF::Function> ()> &&))", + signature); + } + @Test public void testFunctionWithVarargsRvalueParameter() throws Exception {