Skip to content

Commit cf35ff1

Browse files
Fixes to make SizeVerifier work.
In particular change all the places in the Flatbuffers library and generated code that were using `Verifier` to instead use `VerifierTemplate<B>` and wrap them all inside `template <bool B>`. Also add unit tests for SizeVerifier.
1 parent 38736a5 commit cf35ff1

24 files changed

+462
-176
lines changed

include/flatbuffers/flex_flat_util.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,17 @@
2323
namespace flexbuffers {
2424

2525
// Verifies the `nested` flexbuffer within a flatbuffer vector is valid.
26+
<<<<<<< HEAD
2627
template <bool B>
2728
inline bool VerifyNestedFlexBuffer(
2829
const flatbuffers::Vector<uint8_t>* const nested,
2930
flatbuffers::VerifierTemplate<B>& verifier) {
31+
=======
32+
template <bool TrackBufferSize>
33+
inline bool VerifyNestedFlexBuffer(
34+
const flatbuffers::Vector<uint8_t>* const nested,
35+
flatbuffers::VerifierTemplate<TrackBufferSize>& verifier) {
36+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
3037
if (!nested) return true;
3138
return verifier.Check(flexbuffers::VerifyBuffer(
3239
nested->data(), nested->size(), verifier.GetFlexReuseTracker()));

include/flatbuffers/table.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,26 @@ class Table {
122122

123123
// Verify the vtable of this table.
124124
// Call this once per table, followed by VerifyField once per field.
125+
<<<<<<< HEAD
125126
template <bool B>
126127
bool VerifyTableStart(VerifierTemplate<B>& verifier) const {
128+
=======
129+
template <bool TrackBufferSize>
130+
bool VerifyTableStart(VerifierTemplate<TrackBufferSize>& verifier) const {
131+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
127132
return verifier.VerifyTableStart(data_);
128133
}
129134

130135
// Verify a particular field.
136+
<<<<<<< HEAD
131137
template <typename T, bool B>
132138
bool VerifyField(const VerifierTemplate<B>& verifier, voffset_t field,
133139
size_t align) const {
140+
=======
141+
template <typename T, bool TrackBufferSize>
142+
bool VerifyField(const VerifierTemplate<TrackBufferSize>& verifier,
143+
voffset_t field, size_t align) const {
144+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
134145
// Calling GetOptionalFieldOffset should be safe now thanks to
135146
// VerifyTable().
136147
auto field_offset = GetOptionalFieldOffset(field);
@@ -140,39 +151,65 @@ class Table {
140151
}
141152

142153
// VerifyField for required fields.
154+
<<<<<<< HEAD
143155
template <typename T, bool B>
144156
bool VerifyFieldRequired(const VerifierTemplate<B>& verifier, voffset_t field,
145157
size_t align) const {
158+
=======
159+
template <typename T, bool TrackBufferSize>
160+
bool VerifyFieldRequired(const VerifierTemplate<TrackBufferSize>& verifier,
161+
voffset_t field, size_t align) const {
162+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
146163
auto field_offset = GetOptionalFieldOffset(field);
147164
return verifier.Check(field_offset != 0) &&
148165
verifier.template VerifyField<T>(data_, field_offset, align);
149166
}
150167

151168
// Versions for offsets.
169+
<<<<<<< HEAD
152170
template <typename OffsetT = uoffset_t, bool B = false>
153171
bool VerifyOffset(const VerifierTemplate<B>& verifier,
172+
=======
173+
template <typename OffsetT = uoffset_t, bool TrackBufferSize = false>
174+
bool VerifyOffset(const VerifierTemplate<TrackBufferSize>& verifier,
175+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
154176
voffset_t field) const {
155177
auto field_offset = GetOptionalFieldOffset(field);
156178
return !field_offset ||
157179
verifier.template VerifyOffset<OffsetT>(data_, field_offset);
158180
}
159181

182+
<<<<<<< HEAD
160183
template <typename OffsetT = uoffset_t, bool B = false>
161184
bool VerifyOffsetRequired(const VerifierTemplate<B>& verifier,
185+
=======
186+
template <typename OffsetT = uoffset_t, bool TrackBufferSize = false>
187+
bool VerifyOffsetRequired(const VerifierTemplate<TrackBufferSize>& verifier,
188+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
162189
voffset_t field) const {
163190
auto field_offset = GetOptionalFieldOffset(field);
164191
return verifier.Check(field_offset != 0) &&
165192
verifier.template VerifyOffset<OffsetT>(data_, field_offset);
166193
}
167194

195+
<<<<<<< HEAD
168196
template <bool B>
169197
bool VerifyOffset64(const VerifierTemplate<B>& verifier,
198+
=======
199+
template <bool TrackBufferSize>
200+
bool VerifyOffset64(const VerifierTemplate<TrackBufferSize>& verifier,
201+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
170202
voffset_t field) const {
171203
return VerifyOffset<uoffset64_t>(verifier, field);
172204
}
173205

206+
<<<<<<< HEAD
174207
template <bool B>
175208
bool VerifyOffset64Required(const VerifierTemplate<B>& verifier,
209+
=======
210+
template <bool TrackBufferSize>
211+
bool VerifyOffset64Required(const VerifierTemplate<TrackBufferSize>& verifier,
212+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
176213
voffset_t field) const {
177214
return VerifyOffsetRequired<uoffset64_t>(verifier, field);
178215
}

samples/monster_generated.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -617,11 +617,11 @@ inline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_functi
617617
{ auto _e = path(); if (_e) { _o->path.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->path[_i] = *_e->Get(_i); } } else { _o->path.resize(0); } }
618618
}
619619

620-
inline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
621-
return Monster::Pack(_fbb, _o, _rehasher);
620+
inline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
621+
return CreateMonster(_fbb, _o, _rehasher);
622622
}
623623

624-
inline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
624+
inline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
625625
(void)_rehasher;
626626
(void)_o;
627627
struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
@@ -674,11 +674,11 @@ inline void Weapon::UnPackTo(WeaponT *_o, const ::flatbuffers::resolver_function
674674
{ auto _e = damage(); _o->damage = _e; }
675675
}
676676

677-
inline ::flatbuffers::Offset<Weapon> CreateWeapon(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
678-
return Weapon::Pack(_fbb, _o, _rehasher);
677+
inline ::flatbuffers::Offset<Weapon> Weapon::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
678+
return CreateWeapon(_fbb, _o, _rehasher);
679679
}
680680

681-
inline ::flatbuffers::Offset<Weapon> Weapon::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
681+
inline ::flatbuffers::Offset<Weapon> CreateWeapon(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
682682
(void)_rehasher;
683683
(void)_o;
684684
struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const WeaponT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;

src/idl_gen_cpp.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,16 +681,30 @@ class CppGenerator : public BaseGenerator {
681681
code_.SetValue("ID", "nullptr");
682682
}
683683

684+
<<<<<<< HEAD
684685
code_ += "template <bool B = false>";
685686
code_ += "inline bool Verify{{STRUCT_NAME}}Buffer(";
686687
code_ += " ::flatbuffers::VerifierTemplate<B> &verifier) {";
688+
=======
689+
code_ += "template <bool TrackBufferSize>";
690+
code_ += "inline bool Verify{{STRUCT_NAME}}Buffer(";
691+
code_ +=
692+
" ::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) {";
693+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
687694
code_ += " return verifier.template VerifyBuffer<{{CPP_NAME}}>({{ID}});";
688695
code_ += "}";
689696
code_ += "";
690697

698+
<<<<<<< HEAD
691699
code_ += "template <bool B = false>";
692700
code_ += "inline bool VerifySizePrefixed{{STRUCT_NAME}}Buffer(";
693701
code_ += " ::flatbuffers::VerifierTemplate<B> &verifier) {";
702+
=======
703+
code_ += "template <bool TrackBufferSize>";
704+
code_ += "inline bool VerifySizePrefixed{{STRUCT_NAME}}Buffer(";
705+
code_ +=
706+
" ::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) {";
707+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
694708
code_ +=
695709
" return "
696710
"verifier.template "
@@ -1105,6 +1119,7 @@ class CppGenerator : public BaseGenerator {
11051119
}
11061120
}
11071121

1122+
<<<<<<< HEAD
11081123
// For the initial declaration, we specify the template parameters,
11091124
// including template default arguments.
11101125
std::string UnionVerifyTemplateDecl() { return "template <bool B = false>"; }
@@ -1123,13 +1138,31 @@ class CppGenerator : public BaseGenerator {
11231138

11241139
// Should be used in conjunction with
11251140
// UnionVerifyTemplateDecl()/UnionVerifyTemplateDef().
1141+
=======
1142+
std::string UnionVerifyTemplate() {
1143+
return "template <bool TrackBufferSize>";
1144+
}
1145+
1146+
// Should be used in conjunction with UnionVerifyTemplate().
1147+
std::string UnionVerifySignature(const EnumDef& enum_def) {
1148+
return "bool Verify" + Name(enum_def) +
1149+
"(::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier, " +
1150+
"const void *obj, " + Name(enum_def) + " type)";
1151+
}
1152+
1153+
// Should be used in conjunction with UnionVerifyTemplate().
1154+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
11261155
std::string UnionVectorVerifySignature(const EnumDef& enum_def) {
11271156
const std::string name = Name(enum_def);
11281157
const std::string& type =
11291158
opts_.scoped_enums ? name
11301159
: GenTypeBasic(enum_def.underlying_type, false);
11311160
return "bool Verify" + name + "Vector" +
1161+
<<<<<<< HEAD
11321162
"(::flatbuffers::VerifierTemplate<B> &verifier, " +
1163+
=======
1164+
"(::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier, " +
1165+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
11331166
"const ::flatbuffers::Vector<::flatbuffers::Offset<void>> "
11341167
"*values, " +
11351168
"const ::flatbuffers::Vector<" + type + "> *types)";
@@ -1424,9 +1457,15 @@ class CppGenerator : public BaseGenerator {
14241457
GenEnumObjectBasedAPI(enum_def);
14251458

14261459
if (enum_def.is_union) {
1460+
<<<<<<< HEAD
14271461
code_ += UnionVerifyTemplateDecl();
14281462
code_ += UnionVerifySignature(enum_def) + ";";
14291463
code_ += UnionVerifyTemplateDecl();
1464+
=======
1465+
code_ += UnionVerifyTemplate();
1466+
code_ += UnionVerifySignature(enum_def) + ";";
1467+
code_ += UnionVerifyTemplate();
1468+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
14301469
code_ += UnionVectorVerifySignature(enum_def) + ";";
14311470
code_ += "";
14321471
}
@@ -1655,7 +1694,11 @@ class CppGenerator : public BaseGenerator {
16551694
// on the wrong type.
16561695
code_.SetValue("ENUM_NAME", Name(enum_def));
16571696

1697+
<<<<<<< HEAD
16581698
code_ += UnionVerifyTemplateDef();
1699+
=======
1700+
code_ += UnionVerifyTemplate();
1701+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
16591702
code_ += "inline " + UnionVerifySignature(enum_def) + " {";
16601703
code_ += " switch (type) {";
16611704
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
@@ -1696,7 +1739,11 @@ class CppGenerator : public BaseGenerator {
16961739
code_ += "}";
16971740
code_ += "";
16981741

1742+
<<<<<<< HEAD
16991743
code_ += UnionVerifyTemplateDef();
1744+
=======
1745+
code_ += UnionVerifyTemplate();
1746+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
17001747
code_ += "inline " + UnionVectorVerifySignature(enum_def) + " {";
17011748
code_ += " if (!values || !types) return !values && !types;";
17021749
code_ += " if (values->size() != types->size()) return false;";
@@ -3020,9 +3067,15 @@ class CppGenerator : public BaseGenerator {
30203067

30213068
// Generate a verifier function that can check a buffer from an untrusted
30223069
// source will never cause reads outside the buffer.
3070+
<<<<<<< HEAD
30233071
code_ += " template <bool B = false>";
30243072
code_ +=
30253073
" bool Verify(::flatbuffers::VerifierTemplate<B> "
3074+
=======
3075+
code_ += " template <bool TrackBufferSize>";
3076+
code_ +=
3077+
" bool Verify(::flatbuffers::VerifierTemplate<TrackBufferSize> "
3078+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
30263079
"&verifier) const {";
30273080
code_ += " return VerifyTableStart(verifier)\\";
30283081
for (const auto& field : struct_def.fields.vec) {

src/idl_parser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4352,8 +4352,13 @@ bool Parser::Deserialize(const uint8_t* buf, const size_t size) {
43524352
size_prefixed = true;
43534353
}
43544354
auto verify_fn = size_prefixed
4355+
<<<<<<< HEAD
43554356
? &reflection::VerifySizePrefixedSchemaBuffer<false>
43564357
: &reflection::VerifySchemaBuffer<false>;
4358+
=======
4359+
? &reflection::VerifySizePrefixedSchemaBuffer<false>
4360+
: &reflection::VerifySchemaBuffer<false>;
4361+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
43574362
if (!verify_fn(verifier)) {
43584363
return false;
43594364
}

tests/64bit/evolution/v1_generated.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,13 @@ struct RootTable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
5252
::flatbuffers::Vector<uint8_t> *mutable_b() {
5353
return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_B);
5454
}
55+
<<<<<<< HEAD
5556
template <bool B = false>
5657
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
58+
=======
59+
template <bool TrackBufferSize>
60+
bool Verify(::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) const {
61+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
5762
return VerifyTableStart(verifier) &&
5863
VerifyField<float>(verifier, VT_A, 4) &&
5964
VerifyOffset(verifier, VT_B) &&
@@ -181,6 +186,7 @@ inline v1::RootTable *GetMutableSizePrefixedRootTable(void *buf) {
181186
return ::flatbuffers::GetMutableSizePrefixedRoot<v1::RootTable>(buf);
182187
}
183188

189+
<<<<<<< HEAD
184190
template <bool B = false>
185191
inline bool VerifyRootTableBuffer(
186192
::flatbuffers::VerifierTemplate<B> &verifier) {
@@ -190,6 +196,17 @@ inline bool VerifyRootTableBuffer(
190196
template <bool B = false>
191197
inline bool VerifySizePrefixedRootTableBuffer(
192198
::flatbuffers::VerifierTemplate<B> &verifier) {
199+
=======
200+
template <bool TrackBufferSize>
201+
inline bool VerifyRootTableBuffer(
202+
::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) {
203+
return verifier.template VerifyBuffer<v1::RootTable>(nullptr);
204+
}
205+
206+
template <bool TrackBufferSize>
207+
inline bool VerifySizePrefixedRootTableBuffer(
208+
::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) {
209+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
193210
return verifier.template VerifySizePrefixedBuffer<v1::RootTable>(nullptr);
194211
}
195212

tests/64bit/evolution/v2_generated.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,13 @@ struct RootTable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
6060
::flatbuffers::Vector64<uint8_t> *mutable_big_vector() {
6161
return GetPointer64<::flatbuffers::Vector64<uint8_t> *>(VT_BIG_VECTOR);
6262
}
63+
<<<<<<< HEAD
6364
template <bool B = false>
6465
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
66+
=======
67+
template <bool TrackBufferSize>
68+
bool Verify(::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) const {
69+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
6570
return VerifyTableStart(verifier) &&
6671
VerifyField<float>(verifier, VT_A, 4) &&
6772
VerifyOffset(verifier, VT_B) &&
@@ -205,6 +210,7 @@ inline v2::RootTable *GetMutableSizePrefixedRootTable(void *buf) {
205210
return ::flatbuffers::GetMutableSizePrefixedRoot<v2::RootTable,::flatbuffers::uoffset64_t>(buf);
206211
}
207212

213+
<<<<<<< HEAD
208214
template <bool B = false>
209215
inline bool VerifyRootTableBuffer(
210216
::flatbuffers::VerifierTemplate<B> &verifier) {
@@ -214,6 +220,17 @@ inline bool VerifyRootTableBuffer(
214220
template <bool B = false>
215221
inline bool VerifySizePrefixedRootTableBuffer(
216222
::flatbuffers::VerifierTemplate<B> &verifier) {
223+
=======
224+
template <bool TrackBufferSize>
225+
inline bool VerifyRootTableBuffer(
226+
::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) {
227+
return verifier.template VerifyBuffer<v2::RootTable>(nullptr);
228+
}
229+
230+
template <bool TrackBufferSize>
231+
inline bool VerifySizePrefixedRootTableBuffer(
232+
::flatbuffers::VerifierTemplate<TrackBufferSize> &verifier) {
233+
>>>>>>> 0af519ec (Fixes to make SizeVerifier work.)
217234
return verifier.template VerifySizePrefixedBuffer<v2::RootTable,::flatbuffers::uoffset64_t>(nullptr);
218235
}
219236

0 commit comments

Comments
 (0)