diff options
| author | xiphon <xiphon@protonmail.com> | 2019-12-17 14:18:54 +0000 |
|---|---|---|
| committer | xiphon <xiphon@protonmail.com> | 2019-12-17 14:18:54 +0000 |
| commit | e0ab9aa898fdd813c73ea3c47ffb0f9b5f80e9cf (patch) | |
| tree | 032a106b64c293feec2acf81c10fa1c4c6e4703a /src/libwalletqt | |
| parent | c9900c05b22d8e4aa847fea4428b432d6cfa47d7 (diff) | |
| download | monzero-gui-e0ab9aa898fdd813c73ea3c47ffb0f9b5f80e9cf.tar.gz monzero-gui-e0ab9aa898fdd813c73ea3c47ffb0f9b5f80e9cf.tar.xz monzero-gui-e0ab9aa898fdd813c73ea3c47ffb0f9b5f80e9cf.zip | |
SubaddressAccount: fix use-after-free bug
Diffstat (limited to 'src/libwalletqt')
| -rw-r--r-- | src/libwalletqt/SubaddressAccount.cpp | 26 | ||||
| -rw-r--r-- | src/libwalletqt/SubaddressAccount.h | 6 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/libwalletqt/SubaddressAccount.cpp b/src/libwalletqt/SubaddressAccount.cpp index 1d83fcbd..940413a7 100644 --- a/src/libwalletqt/SubaddressAccount.cpp +++ b/src/libwalletqt/SubaddressAccount.cpp @@ -36,24 +36,34 @@ SubaddressAccount::SubaddressAccount(Monero::SubaddressAccount *subaddressAccoun getAll(); } -QList<Monero::SubaddressAccountRow *> SubaddressAccount::getAll() const +void SubaddressAccount::getAll() const { qDebug(__FUNCTION__); emit refreshStarted(); - m_rows.clear(); - for (auto &row: m_subaddressAccountImpl->getAll()) { - m_rows.append(row); + { + QWriteLocker locker(&m_lock); + m_rows.clear(); + for (auto &row: m_subaddressAccountImpl->getAll()) { + m_rows.append(row); + } } emit refreshFinished(); - return m_rows; } -Monero::SubaddressAccountRow * SubaddressAccount::getRow(int index) const +bool SubaddressAccount::getRow(int index, std::function<void (Monero::SubaddressAccountRow &)> callback) const { - return m_rows.at(index); + QReadLocker locker(&m_lock); + + if (index < 0 || index >= m_rows.size()) + { + return false; + } + + callback(*m_rows.value(index)); + return true; } void SubaddressAccount::addRow(const QString &label) const @@ -76,5 +86,7 @@ void SubaddressAccount::refresh() const quint64 SubaddressAccount::count() const { + QReadLocker locker(&m_lock); + return m_rows.size(); } diff --git a/src/libwalletqt/SubaddressAccount.h b/src/libwalletqt/SubaddressAccount.h index b7979156..2cdaf317 100644 --- a/src/libwalletqt/SubaddressAccount.h +++ b/src/libwalletqt/SubaddressAccount.h @@ -31,6 +31,7 @@ #include <wallet/api/wallet2_api.h> #include <QObject> +#include <QReadWriteLock> #include <QList> #include <QDateTime> @@ -38,8 +39,8 @@ class SubaddressAccount : public QObject { Q_OBJECT public: - Q_INVOKABLE QList<Monero::SubaddressAccountRow *> getAll() const; - Q_INVOKABLE Monero::SubaddressAccountRow * getRow(int index) const; + Q_INVOKABLE void getAll() const; + Q_INVOKABLE bool getRow(int index, std::function<void (Monero::SubaddressAccountRow &)> callback) const; Q_INVOKABLE void addRow(const QString &label) const; Q_INVOKABLE void setLabel(quint32 accountIndex, const QString &label) const; Q_INVOKABLE void refresh() const; @@ -54,6 +55,7 @@ public slots: private: explicit SubaddressAccount(Monero::SubaddressAccount * subaddressAccountImpl, QObject *parent); friend class Wallet; + mutable QReadWriteLock m_lock; Monero::SubaddressAccount * m_subaddressAccountImpl; mutable QList<Monero::SubaddressAccountRow*> m_rows; }; |
