summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2023-01-02 16:43:41 -0500
committerGlenn Smith <glenn@vector35.com>2023-01-03 19:21:04 -0500
commit63a93869607c85f8d456d49bd8c1837047721c15 (patch)
treef96585dbff7373dacc5da85810fb13e6a3cf536e
parent5088ccdc46c37db4cd95574575b8afd83113f839 (diff)
Fix UAF chance in BackgroundThread
If a the owning object is deleted in between the m_owner check and a main thread action being run, the action was not cancelled properly.
-rw-r--r--ui/progresstask.h32
1 files changed, 24 insertions, 8 deletions
diff --git a/ui/progresstask.h b/ui/progresstask.h
index 9245349c..08cc8685 100644
--- a/ui/progresstask.h
+++ b/ui/progresstask.h
@@ -303,12 +303,16 @@ class BINARYNINJAUIAPI BackgroundThread : public QObject
{
for (auto& func : m_then)
{
- if (m_hasOwner && !m_owner)
+ if (m_hasOwner && m_owner.isNull())
return;
switch (func.first)
{
case MainThread:
- BinaryNinja::ExecuteOnMainThreadAndWait([&]() { value = func.second(value); });
+ BinaryNinja::ExecuteOnMainThreadAndWait([&]() {
+ if (m_hasOwner && m_owner.isNull())
+ return;
+ value = func.second(value);
+ });
break;
case Background:
value = func.second(value);
@@ -317,14 +321,18 @@ class BINARYNINJAUIAPI BackgroundThread : public QObject
}
for (auto& func : m_finally)
{
- if (m_hasOwner && !m_owner)
+ if (m_hasOwner && m_owner.isNull())
return;
try
{
switch (func.first)
{
case MainThread:
- BinaryNinja::ExecuteOnMainThreadAndWait([&]() { func.second(true); });
+ BinaryNinja::ExecuteOnMainThreadAndWait([&]() {
+ if (m_hasOwner && m_owner.isNull())
+ return;
+ func.second(true);
+ });
break;
case Background:
func.second(true);
@@ -349,14 +357,18 @@ class BINARYNINJAUIAPI BackgroundThread : public QObject
std::exception_ptr exc = std::current_exception();
for (auto& func : m_catch)
{
- if (m_hasOwner && !m_owner)
+ if (m_hasOwner && m_owner.isNull())
return;
try
{
switch (func.first)
{
case MainThread:
- BinaryNinja::ExecuteOnMainThreadAndWait([&]() { func.second(exc); });
+ BinaryNinja::ExecuteOnMainThreadAndWait([&]() {
+ if (m_hasOwner && m_owner.isNull())
+ return;
+ func.second(exc);
+ });
break;
case Background:
func.second(exc);
@@ -370,14 +382,18 @@ class BINARYNINJAUIAPI BackgroundThread : public QObject
}
for (auto& func : m_finally)
{
- if (m_hasOwner && !m_owner)
+ if (m_hasOwner && m_owner.isNull())
return;
try
{
switch (func.first)
{
case MainThread:
- BinaryNinja::ExecuteOnMainThreadAndWait([&]() { func.second(false); });
+ BinaryNinja::ExecuteOnMainThreadAndWait([&]() {
+ if (m_hasOwner && m_owner.isNull())
+ return;
+ func.second(false);
+ });
break;
case Background:
func.second(false);