From e0ab9aa898fdd813c73ea3c47ffb0f9b5f80e9cf Mon Sep 17 00:00:00 2001 From: xiphon Date: Tue, 17 Dec 2019 14:18:54 +0000 Subject: SubaddressAccount: fix use-after-free bug --- src/libwalletqt/SubaddressAccount.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'src/libwalletqt/SubaddressAccount.cpp') 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 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 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(); } -- cgit v1.2.3