summaryrefslogtreecommitdiff
path: root/examples/triage/strings.h
diff options
context:
space:
mode:
authorJordan Wiens <github@psifertex.com>2025-12-19 15:57:20 -0500
committerJordan Wiens <github@psifertex.com>2025-12-19 16:05:02 -0500
commit34622adc292cb10b84c7984fc0cef966ee2c19b7 (patch)
treeb08efae7118bbc20ffbd4f0b4a25bb8ae3d7e42a /examples/triage/strings.h
parentdbdf3381e2dd32527cffaca6081fc5a9913f1cc7 (diff)
fix strings missing race condition
Diffstat (limited to 'examples/triage/strings.h')
-rw-r--r--examples/triage/strings.h36
1 files changed, 35 insertions, 1 deletions
diff --git a/examples/triage/strings.h b/examples/triage/strings.h
index 14762b34..31617f08 100644
--- a/examples/triage/strings.h
+++ b/examples/triage/strings.h
@@ -1,21 +1,43 @@
#pragma once
#include <QtCore/QAbstractItemModel>
+#include <QtCore/QTimer>
#include <QtWidgets/QTreeView>
#include "filter.h"
-class GenericStringsModel : public QAbstractItemModel
+class GenericStringsModel : public QAbstractItemModel, public BinaryNinja::BinaryDataNotification
{
+ Q_OBJECT
+
BinaryViewRef m_data;
std::vector<BNStringReference> m_allEntries, m_entries;
int m_totalCols, m_sortCol;
Qt::SortOrder m_sortOrder;
+ std::string m_filter;
+ QTimer* m_updateTimer;
+
+ // Read from arbitrary threads while processing notifications.
+ std::atomic<bool> m_updatesPaused = false;
+ // Read/written from arbitrary threads while processing notifications.
+ std::atomic<bool> m_needsUpdate = true;
+ // Tracks if notifications arrived while paused
+ std::atomic<bool> m_dirtyWhilePaused = false;
void performSort(int col, Qt::SortOrder order);
+ void updateModel();
+ void applyFilter();
+
+ void updateTimer(bool);
+ void setNeedsUpdate(bool);
+ void onBinaryViewNotification();
+
+signals:
+ void updateTimerOnUIThread();
public:
GenericStringsModel(QWidget* parent, BinaryViewRef data);
+ virtual ~GenericStringsModel();
virtual int columnCount(const QModelIndex& parent) const override;
virtual int rowCount(const QModelIndex& parent) const override;
@@ -26,8 +48,16 @@ class GenericStringsModel : public QAbstractItemModel
virtual void sort(int col, Qt::SortOrder order) override;
void setFilter(const std::string& filterText);
+ void pauseUpdates();
+ void resumeUpdates();
+
BNStringReference getStringRefAt(const QModelIndex& index) const;
QString stringRefToQString(const BNStringReference& index) const;
+
+ virtual void OnStringFound(BinaryNinja::BinaryView* data, BNStringType type, uint64_t offset, size_t len) override;
+ virtual void OnStringRemoved(BinaryNinja::BinaryView* data, BNStringType type, uint64_t offset, size_t len) override;
+ virtual void OnDerivedStringFound(BinaryNinja::BinaryView* data, const BinaryNinja::DerivedString& str) override;
+ virtual void OnDerivedStringRemoved(BinaryNinja::BinaryView* data, const BinaryNinja::DerivedString& str) override;
};
@@ -36,6 +66,8 @@ class StringsWidget;
class StringsTreeView : public QTreeView, public FilterTarget
{
+ Q_OBJECT
+
BinaryViewRef m_data;
StringsWidget* m_parent;
TriageView* m_view;
@@ -59,6 +91,8 @@ class StringsTreeView : public QTreeView, public FilterTarget
protected:
virtual void keyPressEvent(QKeyEvent* event) override;
virtual bool event(QEvent* event) override;
+ virtual void showEvent(QShowEvent* event) override;
+ virtual void hideEvent(QHideEvent* event) override;
private Q_SLOTS:
void stringSelected(const QModelIndex& cur, const QModelIndex& prev);