h5rs tools, browser reader, libhdf5 header checks, plugin filters, concurrency benchmark #14
@@ -143,6 +143,9 @@ pub fn blosc_decompress(input: &[u8], limit: usize) -> Result<Vec<u8>, FormatErr
|
|||||||
if cbytes > input.len() {
|
if cbytes > input.len() {
|
||||||
return Err(err("frame is longer than the chunk"));
|
return Err(err("frame is longer than the chunk"));
|
||||||
}
|
}
|
||||||
|
if cbytes < HEADER {
|
||||||
|
return Err(err("truncated frame"));
|
||||||
|
}
|
||||||
let src = &input[..cbytes];
|
let src = &input[..cbytes];
|
||||||
if nbytes == 0 {
|
if nbytes == 0 {
|
||||||
return Ok(Vec::new());
|
return Ok(Vec::new());
|
||||||
@@ -189,10 +192,11 @@ pub fn blosc_decompress(input: &[u8], limit: usize) -> Result<Vec<u8>, FormatErr
|
|||||||
let mut pos = le32(src, HEADER + 4 * j)?;
|
let mut pos = le32(src, HEADER + 4 * j)?;
|
||||||
let tmp = &mut tmp[..bsize];
|
let tmp = &mut tmp[..bsize];
|
||||||
for s in 0..nsplits {
|
for s in 0..nsplits {
|
||||||
if pos + 4 > src.len() {
|
let clen = src
|
||||||
return Err(err("block offset out of range"));
|
.get(pos..)
|
||||||
}
|
.and_then(|rest| rest.get(..4))
|
||||||
let clen = le32(src, pos)?;
|
.map(|b| u32::from_le_bytes(b.try_into().unwrap()) as usize)
|
||||||
|
.ok_or_else(|| err("block offset out of range"))?;
|
||||||
pos += 4;
|
pos += 4;
|
||||||
let stream = src
|
let stream = src
|
||||||
.get(pos..pos.saturating_add(clen))
|
.get(pos..pos.saturating_add(clen))
|
||||||
@@ -601,4 +605,21 @@ mod tests {
|
|||||||
let ctx0 = FilterContext { filter: &f0, ..ctx };
|
let ctx0 = FilterContext { filter: &f0, ..ctx };
|
||||||
assert!(blosc_encode(&data, &ctx0).is_err());
|
assert!(blosc_encode(&data, &ctx0).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A frame whose header claims a compressed size smaller than the
|
||||||
|
/// header itself, not stored raw: an error, not an arithmetic overflow
|
||||||
|
/// (it panicked in debug builds).
|
||||||
|
#[test]
|
||||||
|
fn frame_size_below_the_header_is_an_error() {
|
||||||
|
let mut frame = vec![2u8, 1, 1 << 5, 4];
|
||||||
|
for v in [64u32, 64, 8] {
|
||||||
|
frame.extend_from_slice(&v.to_le_bytes());
|
||||||
|
}
|
||||||
|
frame.extend_from_slice(&[0; 40]);
|
||||||
|
assert!(blosc_decompress(&frame, 1000).is_err());
|
||||||
|
for cbytes in 0..16u32 {
|
||||||
|
frame[12..16].copy_from_slice(&cbytes.to_le_bytes());
|
||||||
|
assert!(blosc_decompress(&frame, 1000).is_err(), "cbytes={cbytes}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user