Avoid invalid read on invalid Void msg

This commit is contained in:
Andrew Noyes 2020-03-02 12:10:47 -08:00
parent cdbe3117d7
commit 24bbf5a8f0
1 changed files with 11 additions and 9 deletions

View File

@ -922,28 +922,30 @@ struct LoadSaveHelper : Context {
static constexpr bool isSerializing = false;
static constexpr bool is_fb_visitor = true;
const uint16_t* vtable;
const uint8_t* current;
SerializeFun(const uint16_t* vtable, const uint8_t* current, Context& context)
: Context(context), vtable(vtable), current(current) {}
SerializeFun(const uint8_t* current, Context& context) : Context(context), current(current) {}
template <class... Args>
void operator()(Args&... members) {
if (sizeof...(Args) == 0) {
return;
}
uint32_t current_offset = interpret_as<uint32_t>(current);
current += current_offset;
int32_t vtable_offset = interpret_as<int32_t>(current);
const uint16_t* vtable = reinterpret_cast<const uint16_t*>(current - vtable_offset);
int i = 0;
uint16_t vtable_length = vtable[i++] / sizeof(uint16_t);
uint16_t table_length = vtable[i++];
for_each(LoadMember<Context>{ vtable, current, vtable_length, table_length, i, this->context() }, members...);
for_each(LoadMember<Context>{ vtable, current, vtable_length, table_length, i, this->context() },
members...);
}
};
template <class Member>
std::enable_if_t<expect_serialize_member<Member>> load(Member& member, const uint8_t* current) {
uint32_t current_offset = interpret_as<uint32_t>(current);
current += current_offset;
int32_t vtable_offset = interpret_as<int32_t>(current);
const uint16_t* vtable = reinterpret_cast<const uint16_t*>(current - vtable_offset);
SerializeFun fun(vtable, current, this->context());
SerializeFun fun(current, this->context());
if constexpr (serializable_traits<Member>::value) {
serializable_traits<Member>::serialize(fun, member);
} else {