Skip to content

Commit

Permalink
Fix a potential race
Browse files Browse the repository at this point in the history
  • Loading branch information
0cyn committed Jan 24, 2023
1 parent 4bd9adf commit 1a6f3dd
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
24 changes: 15 additions & 9 deletions MessageHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,23 @@ const std::set<std::string> arcFunctionNames = {
MessageHandler::MessageHandler(Ref<BinaryView> data)
: m_data(data)
{
std::unique_lock<std::recursive_mutex> lock(m_stubMutex);

m_authStubsSection = data->GetSectionByName("__auth_stubs");
m_stubsSection = data->GetSectionByName("__stubs");

m_msgSendFunctions = findMsgSendFunctions(data);
m_arcFunctions = findARCFunctions(data);

if (!m_authStubsSection && !m_stubsSection)
m_readyForRealAnalysisPass = true;
else
data->RegisterNotification(this);

m_msgSendFunctions = findMsgSendFunctions(data);
m_arcFunctions = findARCFunctions(data);
}

void MessageHandler::OnSymbolAdded(BinaryNinja::BinaryView* view, BinaryNinja::Symbol* sym)
{
std::unique_lock<std::mutex> lock(m_stubMutex);
std::unique_lock<std::recursive_mutex> lock(m_stubMutex);

if (m_readyForRealAnalysisPass)
return;
Expand Down Expand Up @@ -79,7 +81,8 @@ void MessageHandler::OnSymbolAdded(BinaryNinja::BinaryView* view, BinaryNinja::S

std::set<uint64_t> MessageHandler::findMsgSendFunctions(BinaryNinja::Ref<BinaryNinja::BinaryView> data)
{
std::unique_lock<std::mutex> lock(m_stubMutex);
std::unique_lock<std::recursive_mutex> lock(m_stubMutex);

std::set<uint64_t> results;
const auto authGotSection = data->GetSectionByName("__auth_got");
const auto gotSection = data->GetSectionByName("__got");
Expand Down Expand Up @@ -114,7 +117,8 @@ std::set<uint64_t> MessageHandler::findMsgSendFunctions(BinaryNinja::Ref<BinaryN

std::set<uint64_t> MessageHandler::findARCFunctions(BinaryNinja::Ref<BinaryNinja::BinaryView> data)
{
std::unique_lock<std::mutex> lock(m_stubMutex);
std::unique_lock<std::recursive_mutex> lock(m_stubMutex);

std::set<uint64_t> results;
const auto authGotSection = data->GetSectionByName("__auth_got");
const auto gotSection = data->GetSectionByName("__got");
Expand Down Expand Up @@ -156,19 +160,21 @@ std::set<uint64_t> MessageHandler::findARCFunctions(BinaryNinja::Ref<BinaryNinja

void MessageHandler::functionWasAnalyzed(uint64_t addr)
{
if (!m_readyForRealAnalysisPass)
if (!m_readyForRealAnalysisPass) {
std::unique_lock<std::mutex> lock(m_reAnalysisRequiredFunctionsMutex);
m_reAnalysisRequiredFunctions.insert(addr);
}
}

bool MessageHandler::isMessageSend(uint64_t functionAddress)
{
std::unique_lock<std::mutex> lock(m_stubMutex);
std::unique_lock<std::recursive_mutex> lock(m_stubMutex);
return m_msgSendFunctions.count(functionAddress);
}

bool MessageHandler::isARCFunction(uint64_t functionAddress)
{
std::unique_lock<std::mutex> lock(m_stubMutex);
std::unique_lock<std::recursive_mutex> lock(m_stubMutex);
return m_arcFunctions.count(functionAddress);
}

Expand Down
3 changes: 2 additions & 1 deletion MessageHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ class MessageHandler : public BinaryNinja::BinaryDataNotification {
BinaryNinja::Ref<BinaryNinja::Section> m_stubsSection;

bool m_readyForRealAnalysisPass = false;
std::mutex m_stubMutex;
std::recursive_mutex m_stubMutex;
std::set<std::string> m_presentRequiredStubs;
std::set<std::string> m_locatedRequiredStubs;

std::mutex m_reAnalysisRequiredFunctionsMutex;
std::set<uint64_t> m_reAnalysisRequiredFunctions;

std::set<uint64_t> m_msgSendFunctions;
Expand Down

0 comments on commit 1a6f3dd

Please sign in to comment.