aboutsummaryrefslogtreecommitdiff
path: root/src/libwalletqt
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2019-12-17 14:18:54 +0000
committerxiphon <xiphon@protonmail.com>2019-12-17 14:18:54 +0000
commite0ab9aa898fdd813c73ea3c47ffb0f9b5f80e9cf (patch)
tree032a106b64c293feec2acf81c10fa1c4c6e4703a /src/libwalletqt
parentc9900c05b22d8e4aa847fea4428b432d6cfa47d7 (diff)
downloadmonzero-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.cpp26
-rw-r--r--src/libwalletqt/SubaddressAccount.h6
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;
};