Fix heap-buffer-overflow if there is a struct within a union

The validator previously did not check if a struct within a union was
valid, causing a heap buffer overflow.  Add a check to make sure that
the struct is valid in this case.

Change-Id: I87d41b12fdfc2a99406789531ba92b841c063c76
parent ecd76e89
...@@ -1213,7 +1213,8 @@ class CppGenerator : public BaseGenerator { ...@@ -1213,7 +1213,8 @@ class CppGenerator : public BaseGenerator {
" auto ptr = reinterpret_cast<const {{TYPE}} *>(obj);"; " auto ptr = reinterpret_cast<const {{TYPE}} *>(obj);";
if (ev.union_type.base_type == BASE_TYPE_STRUCT) { if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
if (ev.union_type.struct_def->fixed) { if (ev.union_type.struct_def->fixed) {
code_ += " return true;"; code_ += " return verifier.Verify<{{TYPE}}>(static_cast<const "
"uint8_t *>(obj), 0);";
} else { } else {
code_ += getptr; code_ += getptr;
code_ += " return verifier.VerifyTable(ptr);"; code_ += " return verifier.VerifyTable(ptr);";
......
...@@ -547,13 +547,13 @@ inline bool VerifyCharacter(flatbuffers::Verifier &verifier, const void *obj, Ch ...@@ -547,13 +547,13 @@ inline bool VerifyCharacter(flatbuffers::Verifier &verifier, const void *obj, Ch
return verifier.VerifyTable(ptr); return verifier.VerifyTable(ptr);
} }
case Character_Rapunzel: { case Character_Rapunzel: {
return true; return verifier.Verify<Rapunzel>(static_cast<const uint8_t *>(obj), 0);
} }
case Character_Belle: { case Character_Belle: {
return true; return verifier.Verify<BookReader>(static_cast<const uint8_t *>(obj), 0);
} }
case Character_BookFan: { case Character_BookFan: {
return true; return verifier.Verify<BookReader>(static_cast<const uint8_t *>(obj), 0);
} }
case Character_Other: { case Character_Other: {
auto ptr = reinterpret_cast<const flatbuffers::String *>(obj); auto ptr = reinterpret_cast<const flatbuffers::String *>(obj);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment