@@ -23,14 +23,14 @@ use arrow::array::{ArrayRef, DictionaryArray, GenericByteArray, StringArray};
2323use arrow:: buffer:: { Buffer , NullBuffer , OffsetBuffer } ;
2424use arrow:: compute:: kernels:: cast;
2525use arrow:: datatypes:: { ByteArrayType , DataType , GenericBinaryType , GenericStringType } ;
26- use snafu:: ResultExt ;
26+ use snafu:: { ensure , ResultExt } ;
2727
2828use crate :: array_decoder:: derive_present_vec;
2929use crate :: column:: Column ;
3030use crate :: compression:: Decompressor ;
3131use crate :: encoding:: integer:: get_unsigned_int_decoder;
3232use crate :: encoding:: PrimitiveValueDecoder ;
33- use crate :: error:: { ArrowSnafu , IoSnafu , Result } ;
33+ use crate :: error:: { ArrowSnafu , IoSnafu , OffsetOverflowSnafu , Result } ;
3434use crate :: proto:: column_encoding:: Kind as ColumnEncodingKind ;
3535use crate :: proto:: stream:: Kind ;
3636use crate :: stripe:: Stripe ;
@@ -123,6 +123,14 @@ impl<T: ByteArrayType> GenericByteArrayDecoder<T> {
123123 self . lengths . decode ( & mut lengths) ?;
124124 }
125125 let total_length: i64 = lengths. iter ( ) . sum ( ) ;
126+ ensure ! (
127+ total_length <= i32 :: MAX as i64 ,
128+ OffsetOverflowSnafu {
129+ total_length,
130+ max_size: i32 :: MAX ,
131+ batch_size,
132+ }
133+ ) ;
126134 // Fetch all data bytes at once
127135 let mut bytes = Vec :: with_capacity ( total_length as usize ) ;
128136 self . bytes
0 commit comments