Possibly fix crash on accepting invites

fixes #857
This commit is contained in:
Nicolas Werner 2022-01-03 03:57:57 +01:00
parent eee61cd524
commit f14f978c48
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9
1 changed files with 31 additions and 27 deletions

View File

@ -2788,40 +2788,44 @@ Cache::getMembers(const std::string &room_id, std::size_t startIndex, std::size_
std::vector<RoomMember> std::vector<RoomMember>
Cache::getMembersFromInvite(const std::string &room_id, std::size_t startIndex, std::size_t len) Cache::getMembersFromInvite(const std::string &room_id, std::size_t startIndex, std::size_t len)
{ {
auto txn = ro_txn(env_); auto txn = ro_txn(env_);
auto db = getInviteMembersDb(txn, room_id);
auto cursor = lmdb::cursor::open(txn, db);
std::size_t currentIndex = 0;
const auto endIndex = std::min(startIndex + len, db.size(txn));
std::vector<RoomMember> members; std::vector<RoomMember> members;
std::string_view user_id, user_data; try {
while (cursor.get(user_id, user_data, MDB_NEXT)) { auto db = getInviteMembersDb(txn, room_id);
if (currentIndex < startIndex) { auto cursor = lmdb::cursor::open(txn, db);
std::size_t currentIndex = 0;
const auto endIndex = std::min(startIndex + len, db.size(txn));
std::string_view user_id, user_data;
while (cursor.get(user_id, user_data, MDB_NEXT)) {
if (currentIndex < startIndex) {
currentIndex += 1;
continue;
}
if (currentIndex >= endIndex)
break;
try {
MemberInfo tmp = json::parse(user_data);
members.emplace_back(RoomMember{QString::fromStdString(std::string(user_id)),
QString::fromStdString(tmp.name),
tmp.is_direct});
} catch (const json::exception &e) {
nhlog::db()->warn("{}", e.what());
}
currentIndex += 1; currentIndex += 1;
continue;
} }
if (currentIndex >= endIndex) cursor.close();
break; } catch (const lmdb::error &e) {
nhlog::db()->warn("Failed to retrieve members {}", e.what());
try {
MemberInfo tmp = json::parse(user_data);
members.emplace_back(RoomMember{QString::fromStdString(std::string(user_id)),
QString::fromStdString(tmp.name),
tmp.is_direct});
} catch (const json::exception &e) {
nhlog::db()->warn("{}", e.what());
}
currentIndex += 1;
} }
cursor.close();
return members; return members;
} }