Skip to content

Commit d99afd2

Browse files
scottlambdholroyd
authored andcommitted
handle overflow in delta_scale
1 parent d55c244 commit d99afd2

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

src/nal/pps.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub enum PpsError {
1515
UnknownSeqParamSetId(ParamSetId),
1616
BadPicParamSetId(ParamSetIdError),
1717
BadSeqParamSetId(ParamSetIdError),
18+
ScalingMatrix(sps::ScalingMatrixError),
1819
}
1920

2021
impl From<bitreader::BitReaderError> for PpsError {
@@ -156,9 +157,9 @@ impl PicScalingMatrix {
156157
let seq_scaling_list_present_flag = r.read_bool()?;
157158
if seq_scaling_list_present_flag {
158159
if i < 6 {
159-
scaling_list4x4.push(sps::ScalingList::read(r, 16)?);
160+
scaling_list4x4.push(sps::ScalingList::read(r, 16).map_err(PpsError::ScalingMatrix)?);
160161
} else {
161-
scaling_list8x8.push(sps::ScalingList::read(r, 64)?);
162+
scaling_list8x8.push(sps::ScalingList::read(r, 64).map_err(PpsError::ScalingMatrix)?);
162163
}
163164
}
164165
}

src/nal/sps.rs

+21-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub enum SpsError {
1717
ReaderError(bitreader::BitReaderError),
1818
RbspReaderError(RbspBitReaderError),
1919
PicOrderCnt(PicOrderCntError),
20+
ScalingMatrix(ScalingMatrixError),
2021
/// log2_max_frame_num_minus4 must be between 0 and 12
2122
Log2MaxFrameNumMinus4OutOfRange(u32),
2223
BadSeqParamSetId(ParamSetIdError),
@@ -286,14 +287,17 @@ pub struct ScalingList {
286287
// TODO
287288
}
288289
impl ScalingList {
289-
pub fn read(r: &mut RbspBitReader<'_>, size: u8) -> Result<ScalingList,bitreader::BitReaderError> {
290+
pub fn read(r: &mut RbspBitReader<'_>, size: u8) -> Result<ScalingList,ScalingMatrixError> {
290291
let mut scaling_list = vec!();
291292
let mut last_scale = 8;
292293
let mut next_scale = 8;
293294
let mut _use_default_scaling_matrix_flag = false;
294295
for j in 0..size {
295296
if next_scale != 0 {
296297
let delta_scale = r.read_se()?;
298+
if delta_scale < -128 || delta_scale > 127 {
299+
return Err(ScalingMatrixError::DeltaScaleOutOfRange(delta_scale));
300+
}
297301
next_scale = (last_scale + delta_scale + 256) % 256;
298302
_use_default_scaling_matrix_flag = j == 0 && next_scale == 0;
299303
}
@@ -304,6 +308,20 @@ impl ScalingList {
304308
Ok(ScalingList { })
305309
}
306310
}
311+
312+
#[derive(Debug, PartialEq)]
313+
pub enum ScalingMatrixError {
314+
ReaderError(bitreader::BitReaderError),
315+
/// The `delta_scale` field must be between -128 and 127 inclusive.
316+
DeltaScaleOutOfRange(i32),
317+
}
318+
319+
impl From<bitreader::BitReaderError> for ScalingMatrixError {
320+
fn from(e: bitreader::BitReaderError) -> Self {
321+
ScalingMatrixError::ReaderError(e)
322+
}
323+
}
324+
307325
#[derive(Debug, Clone)]
308326
pub struct SeqScalingMatrix {
309327
// TODO
@@ -314,7 +332,7 @@ impl Default for SeqScalingMatrix {
314332
}
315333
}
316334
impl SeqScalingMatrix {
317-
fn read(r: &mut RbspBitReader<'_>, chroma_format_idc: u32) -> Result<SeqScalingMatrix,bitreader::BitReaderError> {
335+
fn read(r: &mut RbspBitReader<'_>, chroma_format_idc: u32) -> Result<SeqScalingMatrix,ScalingMatrixError> {
318336
let mut scaling_list4x4 = vec!();
319337
let mut scaling_list8x8 = vec!();
320338

@@ -376,7 +394,7 @@ impl ChromaInfo {
376394
fn read_scaling_matrix(r: &mut RbspBitReader<'_>, chroma_format_idc: u32) -> Result<SeqScalingMatrix, SpsError> {
377395
let scaling_matrix_present_flag = r.read_bool()?;
378396
if scaling_matrix_present_flag {
379-
SeqScalingMatrix::read(r, chroma_format_idc).map_err(|e| e.into())
397+
SeqScalingMatrix::read(r, chroma_format_idc).map_err(SpsError::ScalingMatrix)
380398
} else {
381399
Ok(SeqScalingMatrix::default())
382400
}

0 commit comments

Comments
 (0)