From 61542f0d23eb880ea2c06f94ec2b2acea1b1efd2 Mon Sep 17 00:00:00 2001 From: Raphael Taylor-Davies Date: Tue, 7 Jun 2022 11:20:01 +0100 Subject: [PATCH] Don't trample existing data on snappy decompress (#1806) --- parquet/src/compression.rs | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/parquet/src/compression.rs b/parquet/src/compression.rs index f4aecbf4e86..af04da77f31 100644 --- a/parquet/src/compression.rs +++ b/parquet/src/compression.rs @@ -111,9 +111,10 @@ mod snappy_codec { output_buf: &mut Vec, ) -> Result { let len = decompress_len(input_buf)?; - output_buf.resize(len, 0); + let offset = output_buf.len(); + output_buf.resize(offset + len, 0); self.decoder - .decompress(input_buf, output_buf) + .decompress(input_buf, &mut output_buf[offset..]) .map_err(|e| e.into()) } @@ -340,13 +341,13 @@ mod tests { .expect("Error when compressing"); // Decompress with c2 - let mut decompressed_size = c2 + let decompressed_size = c2 .decompress(compressed.as_slice(), &mut decompressed) .expect("Error when decompressing"); assert_eq!(data.len(), decompressed_size); - decompressed.truncate(decompressed_size); assert_eq!(data, decompressed.as_slice()); + decompressed.clear(); compressed.clear(); // Compress with c2 @@ -354,12 +355,32 @@ mod tests { .expect("Error when compressing"); // Decompress with c1 - decompressed_size = c1 + let decompressed_size = c1 .decompress(compressed.as_slice(), &mut decompressed) .expect("Error when decompressing"); assert_eq!(data.len(), decompressed_size); - decompressed.truncate(decompressed_size); assert_eq!(data, decompressed.as_slice()); + + decompressed.clear(); + compressed.clear(); + + // Test does not trample existing data in output buffers + let prefix = &[0xDE, 0xAD, 0xBE, 0xEF]; + decompressed.extend_from_slice(prefix); + compressed.extend_from_slice(prefix); + + c2.compress(data, &mut compressed) + .expect("Error when compressing"); + + assert_eq!(&compressed[..4], prefix); + + let decompressed_size = c2 + .decompress(&compressed[4..], &mut decompressed) + .expect("Error when decompressing"); + + assert_eq!(data.len(), decompressed_size); + assert_eq!(data, &decompressed[4..]); + assert_eq!(&decompressed[..4], prefix); } fn test_codec(c: CodecType) {