0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2025-02-27 14:10:13 +01:00

ircd:Ⓜ️:dbs: Fix partial event_state key constructions.

ircd:Ⓜ️:dbs: Add checks for key part size before integer conversion.
This commit is contained in:
Jason Volk 2020-02-26 13:03:23 -08:00
parent b63a95f065
commit df05533c2c

View file

@ -2599,6 +2599,9 @@ ircd::m::dbs::event_state_key(const mutable_buffer &out_,
tuple tuple
}; };
if(!state_key)
return {};
mutable_buffer out{out_}; mutable_buffer out{out_};
consume(out, copy(out, state_key)); consume(out, copy(out, state_key));
if(!type) if(!type)
@ -2611,13 +2614,10 @@ ircd::m::dbs::event_state_key(const mutable_buffer &out_,
consume(out, copy(out, "\0"_sv)); consume(out, copy(out, "\0"_sv));
consume(out, copy(out, room_id)); consume(out, copy(out, room_id));
if(!room_id)
return {data(out_), data(out)};
consume(out, copy(out, "\0"_sv));
if(depth < 0) if(depth < 0)
return {data(out_), data(out)}; return {data(out_), data(out)};
consume(out, copy(out, "\0"_sv));
consume(out, copy(out, byte_view<string_view>(depth))); consume(out, copy(out, byte_view<string_view>(depth)));
if(!event_idx) if(!event_idx)
return {data(out_), data(out)}; return {data(out_), data(out)};
@ -2629,26 +2629,33 @@ ircd::m::dbs::event_state_key(const mutable_buffer &out_,
ircd::m::dbs::event_state_tuple ircd::m::dbs::event_state_tuple
ircd::m::dbs::event_state_key(const string_view &amalgam) ircd::m::dbs::event_state_key(const string_view &amalgam)
{ {
string_view parts[4]; const auto &[state_key, r0]
const auto num
{ {
tokens(amalgam, '\0', parts) split(amalgam, "\0"_sv)
};
const auto &[type, r1]
{
split(r0, "\0"_sv)
};
const auto &[room_id, r2]
{
split(r1, "\0"_sv)
}; };
assert(num <= 4);
assert(num <= 3 || size(parts[3]) == 16);
return event_state_tuple return event_state_tuple
{ {
parts[0], state_key,
parts[1], type,
num >= 3? room_id?
m::room::id{parts[2]}: m::room::id{room_id}:
m::room::id{}, m::room::id{},
num >= 4? r2.size() >= 8?
int64_t(byte_view<int64_t>(parts[3].substr(0, 8))): int64_t(byte_view<int64_t>(r2.substr(0, 8))):
-1L, -1L,
num >= 4? r2.size() >= 16?
event::idx(byte_view<uint64_t>(parts[3].substr(8))): event::idx(byte_view<uint64_t>(r2.substr(8))):
0UL, 0UL,
}; };
} }