Skip to content

Commit

Permalink
return error instead of assert on invalid predictions data.
Browse files Browse the repository at this point in the history
  • Loading branch information
mcroomp committed Dec 2, 2023
1 parent fe78eb1 commit b53eeb2
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 14 deletions.
23 changes: 14 additions & 9 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ pub fn decompress_deflate_stream(
let mut cabac_decoder =
PredictionDecoderCabac::new(VP8Reader::new(Cursor::new(&cabac_encoded)).unwrap());

let reread_params = PreflateParameters::read(&mut cabac_decoder);
let reread_params = PreflateParameters::read(&mut cabac_decoder)
.map_err(|e| PreflateError::InvalidPredictionData(e))?;
assert_eq!(params, reread_params);

let (recompressed, _recreated_blocks) =
Expand All @@ -115,12 +116,13 @@ pub fn decompress_deflate_stream(
/// recompresses a deflate stream using the cabac_encoded data that was returned from decompress_deflate_stream
pub fn recompress_deflate_stream(
plain_text: &[u8],
cabac_encoded: &[u8],
prediction_corrections: &[u8],
) -> Result<Vec<u8>, PreflateError> {
let mut cabac_decoder =
PredictionDecoderCabac::new(VP8Reader::new(Cursor::new(&cabac_encoded)).unwrap());
PredictionDecoderCabac::new(VP8Reader::new(Cursor::new(&prediction_corrections)).unwrap());

let params = PreflateParameters::read(&mut cabac_decoder);
let params = PreflateParameters::read(&mut cabac_decoder)
.map_err(|e| PreflateError::InvalidPredictionData(e))?;
let (recompressed, _recreated_blocks) =
decode_mispredictions(&params, plain_text, &mut cabac_decoder)?;
Ok(recompressed)
Expand Down Expand Up @@ -152,7 +154,8 @@ pub fn decompress_deflate_stream_assert(
let mut cabac_decoder =
PredictionDecoderCabac::new(DebugReader::new(Cursor::new(&cabac_encoded)).unwrap());

let params = PreflateParameters::read(&mut cabac_decoder);
let params = PreflateParameters::read(&mut cabac_decoder)
.map_err(|e| PreflateError::InvalidPredictionData(e))?;
let (recompressed, _recreated_blocks) =
decode_mispredictions(&params, &contents.plain_text, &mut cabac_decoder)?;

Expand All @@ -174,12 +177,14 @@ pub fn decompress_deflate_stream_assert(
/// This version uses DebugWriter and DebugReader, which are slower and don't compress but can be used to debug the cabac encoding errors.
pub fn recompress_deflate_stream_assert(
plain_text: &[u8],
cabac_encoded: &[u8],
prediction_corrections: &[u8],
) -> Result<Vec<u8>, PreflateError> {
let mut cabac_decoder =
PredictionDecoderCabac::new(DebugReader::new(Cursor::new(&cabac_encoded)).unwrap());
let mut cabac_decoder = PredictionDecoderCabac::new(
DebugReader::new(Cursor::new(&prediction_corrections)).unwrap(),
);

let params = PreflateParameters::read(&mut cabac_decoder);
let params = PreflateParameters::read(&mut cabac_decoder)
.map_err(|e| PreflateError::InvalidPredictionData(e))?;

let (recompressed, _recreated_blocks) =
decode_mispredictions(&params, plain_text, &mut cabac_decoder)?;
Expand Down
2 changes: 2 additions & 0 deletions src/preflate_error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use std::fmt::Display;
#[derive(Debug)]
pub enum PreflateError {
ReadDeflate(anyhow::Error),
InvalidPredictionData(anyhow::Error),
AnalyzeFailed(anyhow::Error),
RecompressFailed(anyhow::Error),
Mismatch(anyhow::Error),
Expand All @@ -24,6 +25,7 @@ pub enum PreflateError {
impl Display for PreflateError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PreflateError::InvalidPredictionData(e) => write!(f, "InvalidPredictionData: {}", e),
PreflateError::ReadDeflate(e) => write!(f, "ReadDeflate: {}", e),
PreflateError::Mismatch(e) => write!(f, "Mismatch: {}", e),
PreflateError::ReadBlock(i, e) => write!(f, "ReadBlock[{}]: {}", i, e),
Expand Down
8 changes: 5 additions & 3 deletions src/preflate_parameter_estimator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
* This software incorporates material from third parties. See NOTICE.txt for details.
*--------------------------------------------------------------------------------------------*/

use anyhow::Result;

use crate::{
bit_helper::bit_length,
complevel_estimator::estimate_preflate_comp_level,
Expand Down Expand Up @@ -60,7 +62,7 @@ pub struct PreflateParameters {
const FILE_VERSION: u16 = 1;

impl PreflateParameters {
pub fn read<D: PredictionDecoder>(decoder: &mut D) -> Self {
pub fn read<D: PredictionDecoder>(decoder: &mut D) -> Result<Self> {
assert_eq!(FILE_VERSION, decoder.decode_value(8));
let strategy = decoder.decode_value(4);
let huff_strategy = decoder.decode_value(4);
Expand Down Expand Up @@ -93,7 +95,7 @@ impl PreflateParameters {
const HASH_ALGORITHM_MINIZ_FAST: u16 = HashAlgorithm::MiniZFast as u16;
const HASH_ALGORITHM_LIBDEFLATE4: u16 = HashAlgorithm::Libdeflate4 as u16;

PreflateParameters {
Ok(PreflateParameters {
strategy: match strategy {
STRATEGY_DEFAULT => PreflateStrategy::Default,
STRATEGY_RLE_ONLY => PreflateStrategy::RleOnly,
Expand Down Expand Up @@ -127,7 +129,7 @@ impl PreflateParameters {
HASH_ALGORITHM_LIBDEFLATE4 => HashAlgorithm::Libdeflate4,
_ => panic!("invalid hash algorithm"),
},
}
})
}

pub fn write<E: PredictionEncoder>(&self, encoder: &mut E) {
Expand Down
4 changes: 2 additions & 2 deletions src/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ fn analyze_compressed_data_fast(
let mut cabac_decoder =
PredictionDecoderCabac::new(VP8Reader::new(Cursor::new(&buffer)).unwrap());

let params = PreflateParameters::read(&mut cabac_decoder);
let params = PreflateParameters::read(&mut cabac_decoder).unwrap();

let (recompressed, _recreated_blocks) =
decode_mispredictions(&params, &contents.plain_text, &mut cabac_decoder).unwrap();
Expand Down Expand Up @@ -309,7 +309,7 @@ fn analyze_compressed_data_verify(

let mut combined_decoder = (debug_decoder, cabac_decoder);

let params_reread = PreflateParameters::read(&mut combined_decoder);
let params_reread = PreflateParameters::read(&mut combined_decoder).unwrap();
assert_eq!(params, params_reread);

let (recompressed, recreated_blocks) =
Expand Down

0 comments on commit b53eeb2

Please sign in to comment.