@@ -454,7 +454,14 @@ impl<T: DataType> Decoder<T> for RleValueDecoder<T> {
454
454
455
455
// We still need to remove prefix of i32 from the stream.
456
456
const I32_SIZE : usize = mem:: size_of :: < i32 > ( ) ;
457
+ if data. len ( ) < I32_SIZE {
458
+ return Err ( eof_err ! ( "Not enough bytes to decode" ) ) ;
459
+ }
457
460
let data_size = bit_util:: read_num_bytes :: < i32 > ( I32_SIZE , data. as_ref ( ) ) as usize ;
461
+ if data. len ( ) - I32_SIZE < data_size {
462
+ return Err ( eof_err ! ( "Not enough bytes to decode" ) ) ;
463
+ }
464
+
458
465
self . decoder = RleDecoder :: new ( 1 ) ;
459
466
self . decoder
460
467
. set_data ( data. slice ( I32_SIZE ..I32_SIZE + data_size) ) ;
@@ -1451,6 +1458,18 @@ mod tests {
1451
1458
decoder. set_data ( Bytes :: from ( vec ! [ 5 , 0 , 0 , 0 ] ) , 1 ) . unwrap ( ) ;
1452
1459
}
1453
1460
1461
+ #[ test]
1462
+ fn test_rle_value_decode_missing_size ( ) {
1463
+ let mut decoder = RleValueDecoder :: < BoolType > :: new ( ) ;
1464
+ assert ! ( decoder. set_data( Bytes :: from( vec![ 0 ] ) , 1 ) . is_err( ) ) ;
1465
+ }
1466
+
1467
+ #[ test]
1468
+ fn test_rle_value_decode_missing_data ( ) {
1469
+ let mut decoder = RleValueDecoder :: < BoolType > :: new ( ) ;
1470
+ assert ! ( decoder. set_data( Bytes :: from( vec![ 5 , 0 , 0 , 0 ] ) , 1 ) . is_err( ) ) ;
1471
+ }
1472
+
1454
1473
#[ test]
1455
1474
fn test_rle_value_decode_bool_decode ( ) {
1456
1475
// Test multiple 'put' calls on the same encoder
0 commit comments