Try to fix crash in setCurrentIndex

fixes #607
This commit is contained in:
Nicolas Werner 2021-07-13 02:45:03 +02:00
parent c600827f78
commit d81e3f94e7
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9

View file

@ -1914,7 +1914,7 @@ Cache::getTimelineIndex(const std::string &room_id, std::string_view event_id)
std::optional<uint64_t> std::optional<uint64_t>
Cache::getEventIndex(const std::string &room_id, std::string_view event_id) Cache::getEventIndex(const std::string &room_id, std::string_view event_id)
{ {
if (event_id.empty()) if (room_id.empty() || event_id.empty())
return {}; return {};
auto txn = ro_txn(env_); auto txn = ro_txn(env_);
@ -1942,7 +1942,7 @@ Cache::getEventIndex(const std::string &room_id, std::string_view event_id)
std::optional<std::pair<uint64_t, std::string>> std::optional<std::pair<uint64_t, std::string>>
Cache::lastInvisibleEventAfter(const std::string &room_id, std::string_view event_id) Cache::lastInvisibleEventAfter(const std::string &room_id, std::string_view event_id)
{ {
if (event_id.empty()) if (room_id.empty() || event_id.empty())
return {}; return {};
auto txn = ro_txn(env_); auto txn = ro_txn(env_);
@ -1967,23 +1967,30 @@ Cache::lastInvisibleEventAfter(const std::string &room_id, std::string_view even
if (!success) { if (!success) {
return {}; return {};
} }
uint64_t prevIdx = lmdb::from_sv<uint64_t>(indexVal);
std::string prevId{event_id};
auto cursor = lmdb::cursor::open(txn, eventOrderDb); try {
cursor.get(indexVal, MDB_SET); uint64_t prevIdx = lmdb::from_sv<uint64_t>(indexVal);
while (cursor.get(indexVal, event_id, MDB_NEXT)) { std::string prevId{event_id};
std::string evId = json::parse(event_id)["event_id"].get<std::string>();
std::string_view temp; auto cursor = lmdb::cursor::open(txn, eventOrderDb);
if (timelineDb.get(txn, evId, temp)) { cursor.get(indexVal, MDB_SET);
return std::pair{prevIdx, std::string(prevId)}; while (cursor.get(indexVal, event_id, MDB_NEXT)) {
} else { std::string evId = json::parse(event_id)["event_id"].get<std::string>();
prevIdx = lmdb::from_sv<uint64_t>(indexVal); std::string_view temp;
prevId = std::move(evId); if (timelineDb.get(txn, evId, temp)) {
return std::pair{prevIdx, std::string(prevId)};
} else {
prevIdx = lmdb::from_sv<uint64_t>(indexVal);
prevId = std::move(evId);
}
} }
}
return std::pair{prevIdx, std::string(prevId)}; return std::pair{prevIdx, std::string(prevId)};
} catch (lmdb::runtime_error &e) {
nhlog::db()->error(
"Failed to get last invisible event after {}", event_id, e.what());
return {};
}
} }
std::optional<uint64_t> std::optional<uint64_t>