From 742a4659f4624efedb3bf6c288db77b4abd66baa Mon Sep 17 00:00:00 2001 From: xiphon Date: Sat, 1 Feb 2020 14:21:33 +0000 Subject: AddressBook: thread-safety, fix use-after-free --- src/model/AddressBookModel.cpp | 43 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 23 deletions(-) (limited to 'src/model/AddressBookModel.cpp') diff --git a/src/model/AddressBookModel.cpp b/src/model/AddressBookModel.cpp index 5c00ad6f..c21fa2f6 100644 --- a/src/model/AddressBookModel.cpp +++ b/src/model/AddressBookModel.cpp @@ -57,30 +57,27 @@ int AddressBookModel::rowCount(const QModelIndex &) const QVariant AddressBookModel::data(const QModelIndex &index, int role) const { - if (!index.isValid()) - return QVariant(); + QVariant result; - if (index.row() < 0 || (unsigned)index.row() >= m_addressBook->count()) { - return QVariant(); - } - - Monero::AddressBookRow * ar = m_addressBook->getRow(index.row()); - - QVariant result = ""; - switch (role) { - case AddressBookAddressRole: - result = QString::fromStdString(ar->getAddress()); - break; - case AddressBookDescriptionRole: - result = QString::fromStdString(ar->getDescription()); - break; - case AddressBookPaymentIdRole: - result = QString::fromStdString(ar->getPaymentId()); - break; - case AddressBookRowIdRole: - // Qt doesnt support size_t overload type casting - result.setValue(ar->getRowId()); - break; + bool found = m_addressBook->getRow(index.row(), [&result, &role](const Monero::AddressBookRow &row) { + switch (role) { + case AddressBookAddressRole: + result = QString::fromStdString(row.getAddress()); + break; + case AddressBookDescriptionRole: + result = QString::fromStdString(row.getDescription()); + break; + case AddressBookPaymentIdRole: + result = QString::fromStdString(row.getPaymentId()); + break; + case AddressBookRowIdRole: + // Qt doesnt support size_t overload type casting + result.setValue(row.getRowId()); + break; + } + }); + if (!found) { + qCritical("%s: internal error: invalid index %d", __FUNCTION__, index.row()); } return result; -- cgit v1.2.3