// comes at the cost of using additional memory the same size of
// the buffer being verified, so it is by default off.
std::vector<uint8_t> *reuse_tracker = nullptr,
+ bool _check_alignment = true,
size_t max_depth = 64)
: buf_(buf),
size_(buf_len),
max_depth_(max_depth),
num_vectors_(0),
max_vectors_(buf_len),
+ check_alignment_(_check_alignment),
reuse_tracker_(reuse_tracker) {
FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE);
if (reuse_tracker_) {
off <= static_cast<uint64_t>(p - buf_);
}
+ bool VerifyAlignment(const uint8_t *p, size_t size) const {
+ auto o = static_cast<size_t>(p - buf_);
+ return Check((o & (size - 1)) == 0 || !check_alignment_);
+ }
+
// Macro, since we want to escape from parent function & use lazy args.
#define FLEX_CHECK_VERIFIED(P, PACKED_TYPE) \
if (reuse_tracker_) { \
if (!VerifyOffset(off, r.data_))
return false;
auto p = r.Indirect();
+ if (!VerifyAlignment(p, r.byte_width_))
+ return false;
switch (r.type_) {
case FBT_INDIRECT_INT:
case FBT_INDIRECT_UINT:
const size_t max_depth_;
size_t num_vectors_;
const size_t max_vectors_;
+ bool check_alignment_;
std::vector<uint8_t> *reuse_tracker_;
};