Fix potential crash when trying to read room info too early

This commit is contained in:
Nicolas Werner 2021-08-11 00:21:02 +02:00
parent 6e8adc7320
commit dbea031a86
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9

View file

@ -1586,26 +1586,32 @@ Cache::roomsWithStateUpdates(const mtx::responses::Sync &res)
RoomInfo RoomInfo
Cache::singleRoomInfo(const std::string &room_id) Cache::singleRoomInfo(const std::string &room_id)
{ {
auto txn = ro_txn(env_); auto txn = ro_txn(env_);
auto statesdb = getStatesDb(txn, room_id);
std::string_view data; try {
auto statesdb = getStatesDb(txn, room_id);
// Check if the room is joined. std::string_view data;
if (roomsDb_.get(txn, room_id, data)) {
try {
RoomInfo tmp = json::parse(data);
tmp.member_count = getMembersDb(txn, room_id).size(txn);
tmp.join_rule = getRoomJoinRule(txn, statesdb);
tmp.guest_access = getRoomGuestAccess(txn, statesdb);
return tmp; // Check if the room is joined.
} catch (const json::exception &e) { if (roomsDb_.get(txn, room_id, data)) {
nhlog::db()->warn("failed to parse room info: room_id ({}), {}: {}", try {
room_id, RoomInfo tmp = json::parse(data);
std::string(data.data(), data.size()), tmp.member_count = getMembersDb(txn, room_id).size(txn);
e.what()); tmp.join_rule = getRoomJoinRule(txn, statesdb);
tmp.guest_access = getRoomGuestAccess(txn, statesdb);
return tmp;
} catch (const json::exception &e) {
nhlog::db()->warn("failed to parse room info: room_id ({}), {}: {}",
room_id,
std::string(data.data(), data.size()),
e.what());
}
} }
} catch (const lmdb::error &e) {
nhlog::db()->warn(
"failed to read room info from db: room_id ({}), {}", room_id, e.what());
} }
return RoomInfo(); return RoomInfo();