Skip to content

Commit 35113c7

Browse files
committed
Align vector body with 8 byte
The C++ implementation of FlatBuffers doesn't verify it but FlatCC verifies it.
1 parent 4d02478 commit 35113c7

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

lib/flatbuffers/serializer.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,20 @@ def add_field_object(field, value)
238238

239239
def add_field_array(field, value)
240240
align!(@table, View::OFFSET_SIZE)
241-
align!(@values, View::OFFSET_SIZE)
241+
242+
# Vector body must be aligned with 8 byte. Vector is
243+
# serialized as |length|body|. `length` is uoffset_t
244+
# (uint32_t) and its size is 4 byte. So we need to align
245+
# `@values` with 8 byte and pad the first 4 byte:
246+
# |4 byte padding|length (4 byte)|body (8 byte aligned)|
247+
vector_body_alignment = 8
248+
vector_length_pack_string = "L<"
249+
vector_length_size = 4
250+
align!(@values, vector_body_alignment)
251+
pad!(@values, vector_body_alignment - vector_length_size)
242252
value_offset = @values.bytesize
243-
# The number of elements.
244-
@values.append_as_bytes([value.size].pack("L<"))
253+
@values.append_as_bytes([value.size].pack(vector_length_pack_string))
254+
245255
element_base_type = field.base_type[0]
246256
case element_base_type
247257
when String

0 commit comments

Comments
 (0)