Skip to content

Commit b1dd56c

Browse files
authored
Fix out of bounds crash in RleValueDecoder (#7441)
1 parent c7f7dc0 commit b1dd56c

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

parquet/src/encodings/decoding.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,14 @@ impl<T: DataType> Decoder<T> for RleValueDecoder<T> {
454454

455455
// We still need to remove prefix of i32 from the stream.
456456
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+
}
457460
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+
458465
self.decoder = RleDecoder::new(1);
459466
self.decoder
460467
.set_data(data.slice(I32_SIZE..I32_SIZE + data_size));
@@ -1451,6 +1458,18 @@ mod tests {
14511458
decoder.set_data(Bytes::from(vec![5, 0, 0, 0]), 1).unwrap();
14521459
}
14531460

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+
14541473
#[test]
14551474
fn test_rle_value_decode_bool_decode() {
14561475
// Test multiple 'put' calls on the same encoder

0 commit comments

Comments
 (0)