3434#include " arrow/table.h"
3535#include " arrow/tensor.h"
3636#include " arrow/type.h"
37+ #include " arrow/util/bit-util.h"
3738#include " arrow/util/logging.h"
3839#include " arrow/visitor_inline.h"
3940
@@ -59,6 +60,9 @@ class IpcComponentSource {
5960 *out = nullptr ;
6061 return Status::OK ();
6162 } else {
63+ DCHECK (BitUtil::IsMultipleOf8 (buffer->offset ()))
64+ << " Buffer " << buffer_index
65+ << " did not start on 8-byte aligned offset: " << buffer->offset ();
6266 return file_->ReadAt (buffer->offset (), buffer->length (), out);
6367 }
6468 }
@@ -550,6 +554,10 @@ class RecordBatchFileReader::RecordBatchFileReaderImpl {
550554 DCHECK_LT (i, num_record_batches ());
551555 FileBlock block = record_batch (i);
552556
557+ DCHECK (BitUtil::IsMultipleOf8 (block.offset ));
558+ DCHECK (BitUtil::IsMultipleOf8 (block.metadata_length ));
559+ DCHECK (BitUtil::IsMultipleOf8 (block.body_length ));
560+
553561 std::unique_ptr<Message> message;
554562 RETURN_NOT_OK (
555563 ReadMessage (block.offset , block.metadata_length , file_.get (), &message));
@@ -564,6 +572,11 @@ class RecordBatchFileReader::RecordBatchFileReaderImpl {
564572 // Read all the dictionaries
565573 for (int i = 0 ; i < num_dictionaries (); ++i) {
566574 FileBlock block = dictionary (i);
575+
576+ DCHECK (BitUtil::IsMultipleOf8 (block.offset ));
577+ DCHECK (BitUtil::IsMultipleOf8 (block.metadata_length ));
578+ DCHECK (BitUtil::IsMultipleOf8 (block.body_length ));
579+
567580 std::unique_ptr<Message> message;
568581 RETURN_NOT_OK (
569582 ReadMessage (block.offset , block.metadata_length , file_.get (), &message));
0 commit comments