Skip to content

Commit 21324fa

Browse files
committed
Remove indenting APIs from Logger. These are thread unsafe by design.
Loggers are not owned by a specific thread and many are used by multiple threads. The indenting APIs could not be made to be thread safe in any way as they exist, so they have been removed. The data races caused by the indenting APIs are actually an important stability issue that could cause the indentation level to go out of bounds and crash the product. If you were using the indentation APIs, you will need to rewrite the usage to manually manage the indentation level in a thread safe way.
1 parent 864374e commit 21324fa

File tree

4 files changed

+49
-120
lines changed

4 files changed

+49
-120
lines changed

binaryninjaapi.h

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,24 +1870,6 @@ namespace BinaryNinja {
18701870
\return The logger session ID
18711871
*/
18721872
size_t GetSessionId();
1873-
1874-
/*! Indent the logger's indentation level by one
1875-
*/
1876-
void Indent();
1877-
1878-
/*! Decrease the logger's indentation level by one
1879-
*/
1880-
void Dedent();
1881-
1882-
/*! Set the logger's indentation level to zero
1883-
*/
1884-
void ResetIndent();
1885-
1886-
/*! Get the string to prepend to log messages to indent them
1887-
1888-
\return Indentation string
1889-
*/
1890-
std::string GetIndent() const;
18911873
};
18921874

18931875
/*! A class allowing registering and retrieving Loggers
@@ -1948,24 +1930,6 @@ namespace BinaryNinja {
19481930
static std::vector<std::string> GetLoggerNames();
19491931
};
19501932

1951-
/*! RAII helper that indents/dedents a Logger inside a scope
1952-
\ingroup logging
1953-
*/
1954-
class LoggerIndentScope
1955-
{
1956-
Ref<Logger> m_logger;
1957-
1958-
public:
1959-
LoggerIndentScope(Ref<Logger> logger): m_logger(logger)
1960-
{
1961-
m_logger->Indent();
1962-
}
1963-
~LoggerIndentScope()
1964-
{
1965-
m_logger->Dedent();
1966-
}
1967-
};
1968-
19691933
/*!
19701934
@addtogroup coreapi
19711935
@{

binaryninjacore.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@
3737
// Current ABI version for linking to the core. This is incremented any time
3838
// there are changes to the API that affect linking, including new functions,
3939
// new types, or modifications to existing functions or types.
40-
#define BN_CURRENT_CORE_ABI_VERSION 145
40+
#define BN_CURRENT_CORE_ABI_VERSION 146
4141

4242
// Minimum ABI version that is supported for loading of plugins. Plugins that
4343
// are linked to an ABI version less than this will not be able to load and
4444
// will require rebuilding. The minimum version is increased when there are
4545
// incompatible changes that break binary compatibility, such as changes to
4646
// existing types or functions.
47-
#define BN_MINIMUM_CORE_ABI_VERSION 141
47+
#define BN_MINIMUM_CORE_ABI_VERSION 146
4848

4949
#ifdef __GNUC__
5050
#ifdef BINARYNINJACORE_LIBRARY
@@ -4031,10 +4031,6 @@ extern "C"
40314031

40324032
BINARYNINJACOREAPI char* BNLoggerGetName(BNLogger* logger);
40334033
BINARYNINJACOREAPI size_t BNLoggerGetSessionId(BNLogger* logger);
4034-
BINARYNINJACOREAPI void BNLoggerIndent(BNLogger* logger);
4035-
BINARYNINJACOREAPI void BNLoggerDedent(BNLogger* logger);
4036-
BINARYNINJACOREAPI void BNLoggerResetIndent(BNLogger* logger);
4037-
BINARYNINJACOREAPI char* BNGetLoggerIndent(BNLogger* logger);
40384034
BINARYNINJACOREAPI BNLogger* BNLogCreateLogger(const char* loggerName, size_t sessionId);
40394035
BINARYNINJACOREAPI BNLogger* BNLogGetLogger(const char* loggerName, size_t sessionId);
40404036
BINARYNINJACOREAPI char** BNLogGetLoggerNames(size_t* count);

demangler/msvc/demangle_msvc.cpp

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ Demangle::Demangle(Architecture* arch, string mangledName) :
162162
m_view(nullptr)
163163
{
164164
m_logger = LogRegistry::CreateLogger("MSVCDemangle");
165-
m_logger->ResetIndent();
165+
//m_logger->ResetIndent();
166166
}
167167

168168

@@ -173,7 +173,7 @@ Demangle::Demangle(Ref<Platform> platform, string mangledName) :
173173
m_view(nullptr)
174174
{
175175
m_logger = LogRegistry::CreateLogger("MSVCDemangle");
176-
m_logger->ResetIndent();
176+
//m_logger->ResetIndent();
177177
}
178178

179179

@@ -186,7 +186,7 @@ Demangle::Demangle(Ref<BinaryView> view, string mangledName) :
186186
throw DemangleException();
187187
m_arch = m_platform->GetArchitecture();
188188
m_logger = LogRegistry::CreateLogger("MSVCDemangle");
189-
m_logger->ResetIndent();
189+
//m_logger->ResetIndent();
190190
}
191191

192192

@@ -293,9 +293,9 @@ TypeBuilder Demangle::DemangleVarType(BackrefList& varList, bool isReturn, Quali
293293
case 'O':
294294
{
295295
QualifiedName name;
296-
m_logger->Indent();
296+
//m_logger->Indent();
297297
auto childType = DemangleVarType(varList, false, name);
298-
m_logger->Dedent();
298+
//m_logger->Dedent();
299299
newType = TypeBuilder::ArrayType(childType.Finalize(), 0);
300300
break;
301301
}
@@ -340,9 +340,9 @@ TypeBuilder Demangle::DemangleVarType(BackrefList& varList, bool isReturn, Quali
340340
reader.Consume(2);
341341
DemangleModifiers(_const, _volatile, isMember);
342342
QualifiedName name;
343-
m_logger->Indent();
343+
//m_logger->Indent();
344344
newType = DemangleVarType(varList, false, name);
345-
m_logger->Dedent();
345+
//m_logger->Dedent();
346346
newType.SetConst(_const);
347347
newType.SetVolatile(_volatile);
348348
return newType;
@@ -467,9 +467,9 @@ TypeBuilder Demangle::DemangleVarType(BackrefList& varList, bool isReturn, Quali
467467
elementList.push_back(element);
468468
}
469469
QualifiedName name;
470-
m_logger->Indent();
470+
//m_logger->Indent();
471471
child = DemangleVarType(varList, false, name);
472-
m_logger->Dedent();
472+
//m_logger->Dedent();
473473

474474
for (auto i = elementList.rbegin(); i != elementList.rend(); i++)
475475
{
@@ -479,9 +479,9 @@ TypeBuilder Demangle::DemangleVarType(BackrefList& varList, bool isReturn, Quali
479479
else
480480
{
481481
QualifiedName name;
482-
m_logger->Indent();
482+
//m_logger->Indent();
483483
child = DemangleVarType(varList, true, name);
484-
m_logger->Dedent();
484+
//m_logger->Dedent();
485485
}
486486

487487
child.SetConst(_const2);
@@ -501,17 +501,17 @@ TypeBuilder Demangle::DemangleVarType(BackrefList& varList, bool isReturn, Quali
501501
}
502502
case EnumerationTypeClass:
503503
m_logger->LogDebug("Demangle enumeration\n");
504-
m_logger->Indent();
504+
//m_logger->Indent();
505505
DemangleName(typeName, classFunctionType, varList);
506-
m_logger->Dedent();
506+
//m_logger->Dedent();
507507
newType = TypeBuilder::NamedType(NamedTypeReference::GenerateAutoDemangledTypeReference(EnumNamedTypeClass, typeName),
508508
width, width);
509509
break;
510510
case StructureTypeClass:
511511
m_logger->LogDebug("Demangle structure\n");
512-
m_logger->Indent();
512+
//m_logger->Indent();
513513
DemangleName(typeName, classFunctionType, varList);
514-
m_logger->Dedent();
514+
//m_logger->Dedent();
515515
switch (structType)
516516
{
517517
case ClassStructureType:
@@ -721,9 +721,9 @@ void Demangle::DemangleVariableList(vector<FunctionParameter>& paramList, Backre
721721
FunctionParameter vt;
722722
QualifiedName name;
723723
m_logger->LogDebug("Argument %d: %s", i, reader.GetRaw());
724-
m_logger->Indent();
724+
//m_logger->Indent();
725725
TypeBuilder type = DemangleVarType(varList, false, name);
726-
m_logger->Dedent();
726+
//m_logger->Dedent();
727727
if (hasModifiers)
728728
{
729729
type.SetConst(_const);
@@ -820,9 +820,9 @@ void Demangle::DemangleNameTypeRtti(BNNameType& classFunctionType,
820820
DemangleModifiers(_const, _volatile, isMember);
821821

822822
QualifiedName name;
823-
m_logger->Indent();
823+
//m_logger->Indent();
824824
rtti = DemangleVarType(nameBackrefList, false, name);
825-
m_logger->Dedent();
825+
//m_logger->Dedent();
826826
rtti.SetConst(_const);
827827
rtti.SetVolatile(_volatile);
828828
rtti.SetPointerSuffix(suffix);
@@ -991,9 +991,9 @@ string Demangle::DemangleTemplateInstantiationName(BackrefList& nameBackrefList)
991991

992992
string Demangle::DemangleTemplateParams(vector<FunctionParameter>& params, BackrefList& nameBackrefList, string& out)
993993
{
994-
m_logger->Indent();
994+
//m_logger->Indent();
995995
DemangleVariableList(params, nameBackrefList);
996-
m_logger->Dedent();
996+
//m_logger->Dedent();
997997
m_logger->LogDebug("VariableList done\n");
998998
out += "<";
999999
for (size_t i = 0; i < params.size(); i++)
@@ -1564,10 +1564,10 @@ TypeBuilder Demangle::DemangleFunction(BNNameType classFunctionType, bool pointe
15641564

15651565
QualifiedName name;
15661566
m_logger->LogDebug("Demangle function return type %s", reader.GetRaw());
1567-
m_logger->Indent();
1567+
//m_logger->Indent();
15681568
returnType = DemangleVarType(nameBackrefList, true, name);
15691569
m_logger->LogDebug("Return type: %s", returnType.GetString().c_str());
1570-
m_logger->Dedent();
1570+
//m_logger->Dedent();
15711571
if (hasModifiers)
15721572
{
15731573
returnType.SetConst(return_const);
@@ -1641,9 +1641,9 @@ TypeBuilder Demangle::DemangleData()
16411641
m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw());
16421642
bool _const = false, _volatile = false, isMember = false;
16431643
QualifiedName name;
1644-
m_logger->Indent();
1644+
//m_logger->Indent();
16451645
TypeBuilder newType = DemangleVarType(m_backrefList, false, name);
1646-
m_logger->Dedent();
1646+
//m_logger->Dedent();
16471647
auto suffix = DemanglePointerSuffix();
16481648
DemangleModifiers(_const, _volatile, isMember);
16491649
newType.SetConst(_const);
@@ -1701,7 +1701,7 @@ TypeBuilder Demangle::DemangleVTable()
17011701
Demangle::DemangleContext Demangle::DemangleSymbol()
17021702
{
17031703
m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw());
1704-
m_logger->Indent();
1704+
//m_logger->Indent();
17051705
BNNameType classFunctionType = NoNameType;
17061706
QualifiedName varName;
17071707

0 commit comments

Comments
 (0)