Skip to content

Commit 29009c7

Browse files
committed
Restore return type confidence which was lost from the initial refactor
Also commonize some of the demangled string length calculations.
1 parent 869055b commit 29009c7

File tree

3 files changed

+18
-4
lines changed

3 files changed

+18
-4
lines changed

demangler/gnu3/demangle_gnu3.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ static inline void rtrim(string &s)
5858
}
5959

6060

61+
static size_t TotalStringSize(const _STD_VECTOR<_STD_STRING>& v)
62+
{
63+
size_t n = 0;
64+
for (const auto& s : v)
65+
n += s.size();
66+
return n;
67+
}
68+
69+
6170
static string GetTemplateString(const vector<string>& args)
6271
{
6372
// Pre-calculate total length to avoid reallocations
@@ -2074,7 +2083,7 @@ DemangledTypeNode DemangleGNU3::DemangleNestedName(bool* allTypeTemplateArgs)
20742083
newName.reserve(aNames.size() + bNames.size());
20752084
newName.insert(newName.end(), aNames.begin(), aNames.end());
20762085
newName.insert(newName.end(), bNames.begin(), bNames.end());
2077-
if ([&]{ size_t n = 0; for (const auto& s : newName) n += s.size(); return n; }() > MAX_DEMANGLE_LENGTH)
2086+
if (TotalStringSize(newName) > MAX_DEMANGLE_LENGTH)
20782087
throw DemangleException("Detected adversarial mangled string");
20792088
type.SetNTR(type.GetNTRClass(), newName);
20802089
type.SetHasTemplateArguments(false);
@@ -2174,7 +2183,7 @@ DemangledTypeNode DemangleGNU3::DemangleLocalName()
21742183
newName.reserve(aNames.size() + bNames.size());
21752184
newName.insert(newName.end(), aNames.begin(), aNames.end());
21762185
newName.insert(newName.end(), bNames.begin(), bNames.end());
2177-
if ([&]{ size_t n = 0; for (const auto& s : newName) n += s.size(); return n; }() > MAX_DEMANGLE_LENGTH)
2186+
if (TotalStringSize(newName) > MAX_DEMANGLE_LENGTH)
21782187
throw DemangleException("Detected adversarial mangled string");
21792188
type.SetTypeName(std::move(newName));
21802189
type.SetConst(tmpType.IsConst());
@@ -2791,6 +2800,8 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(QualifiedName& varName)
27912800
m_functionSubstitute.pop_back();
27922801
m_isParameter = false;
27932802
type = DemangledTypeNode::FunctionType(std::move(returnType), nullptr, std::move(params));
2803+
if (isReturnTypeUnknown)
2804+
type.SetReturnTypeConfidence(BN_MINIMUM_CONFIDENCE);
27942805

27952806
type.SetPointerSuffix(suffix);
27962807
type.SetConst(cnst);

demangler/gnu3/demangled_type_node.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ DemangledTypeNode::DemangledTypeNode()
2929
m_const(false), m_volatile(false), m_signed(false),
3030
m_hasTemplateArgs(false), m_nameType(NoNameType),
3131
m_ntrClass(UnknownNamedTypeClass),
32-
m_pointerReference(PointerReferenceType), m_elements(0)
32+
m_pointerReference(PointerReferenceType), m_elements(0),
33+
m_returnTypeConfidence(BN_DEFAULT_CONFIDENCE)
3334
{
3435
}
3536

@@ -503,7 +504,7 @@ Ref<Type> DemangledTypeNode::Finalize() const
503504
Ref<Type> pType = p.type ? p.type->Finalize() : Ref<Type>(Type::VoidType());
504505
finalParams.push_back({p.name, pType, true, Variable()});
505506
}
506-
TypeBuilder tb = TypeBuilder::FunctionType(retType, nullptr, finalParams);
507+
TypeBuilder tb = TypeBuilder::FunctionType(retType->WithConfidence(m_returnTypeConfidence), nullptr, finalParams);
507508
tb.SetConst(m_const);
508509
tb.SetVolatile(m_volatile);
509510
for (auto ps : m_pointerSuffix)

demangler/gnu3/demangled_type_node.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class DemangledTypeNode
123123
void SetHasTemplateArguments(bool t) { m_hasTemplateArgs = t; }
124124
void SetPointerSuffix(const _STD_SET<BNPointerSuffix>& s) { m_pointerSuffix = s; }
125125
void AddPointerSuffix(BNPointerSuffix ps) { m_pointerSuffix.insert(ps); }
126+
void SetReturnTypeConfidence(uint8_t c) { m_returnTypeConfidence = c; }
126127

127128
// Named type reference operations
128129
void SetNTR(BNNamedTypeReferenceClass cls, _STD_VECTOR<_STD_STRING> nameSegments);
@@ -160,6 +161,7 @@ class DemangledTypeNode
160161

161162
// Function params
162163
_STD_VECTOR<Param> m_params;
164+
uint8_t m_returnTypeConfidence;
163165

164166
// Helpers for string formatting
165167
_STD_STRING GetModifierString() const;

0 commit comments

Comments
 (0)