From 86bf2b746491a35b3c621f621a5a26258c86de88 Mon Sep 17 00:00:00 2001 From: BenSandeen <12025856+BenSandeen@users.noreply.github.com> Date: Thu, 28 Feb 2019 21:35:51 -0700 Subject: [PATCH 1/4] Address issue at https://github.com/RustAudio/lewton/issues/44 --- src/audio.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/audio.rs b/src/audio.rs index e625983..b879cba 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -127,6 +127,9 @@ fn floor_zero_decode(rdr :&mut BitpackCursor, codebooks :&[Codebook], // Undecodable per spec None => try!(Err(FloorSpecialCase::PacketUndecodable)), Some(codebook_idx) => { + if *codebook_idx as usize >= (&codebooks).len() { + return Err(FloorSpecialCase::PacketUndecodable) + } let mut coefficients = Vec::with_capacity(fl.floor0_order as usize); let mut last = 0.0; let codebook = &codebooks[*codebook_idx as usize]; @@ -716,7 +719,7 @@ fn residue_packet_decode_inner(rdr :&mut BitpackCursor, cur_blocksize :u16, } -// Ok means "fine" (or end of packet, but thats "fine" too!), +// Ok means "fine" (or end of packet, but that's "fine" too!), // Err means "not fine" -- the whole packet must be discarded fn residue_packet_decode(rdr :&mut BitpackCursor, cur_blocksize :u16, do_not_decode_flag :&[bool], resid :&Residue, codebooks :&[Codebook]) -> Result, ()> { From 2600deee4981eb305cc7280af7c818e5c8c96127 Mon Sep 17 00:00:00 2001 From: BenSandeen <12025856+BenSandeen@users.noreply.github.com> Date: Fri, 1 Mar 2019 07:40:42 -0700 Subject: [PATCH 2/4] Adapt fix to better fit in with existing code --- src/audio.rs | 56 ++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index b879cba..332424f 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -127,37 +127,37 @@ fn floor_zero_decode(rdr :&mut BitpackCursor, codebooks :&[Codebook], // Undecodable per spec None => try!(Err(FloorSpecialCase::PacketUndecodable)), Some(codebook_idx) => { - if *codebook_idx as usize >= (&codebooks).len() { - return Err(FloorSpecialCase::PacketUndecodable) - } - let mut coefficients = Vec::with_capacity(fl.floor0_order as usize); - let mut last = 0.0; - let codebook = &codebooks[*codebook_idx as usize]; - loop { - let mut last_new = last; - let temp_vector = try!(rdr.read_huffman_vq(codebook)); - if temp_vector.len() + coefficients.len() < fl.floor0_order as usize { - // Little optimisation: we don't have to care about the >= case here - for &e in temp_vector { - coefficients.push((last + e as f32).cos()); - last_new = e as f32; - } - } else { - for &e in temp_vector { - coefficients.push((last + e as f32).cos()); - last_new = e as f32; - // This rule makes sure that coefficients doesn't get - // larger than floor0_order and saves an allocation - // in this case - if coefficients.len() == fl.floor0_order as usize { - return Ok((coefficients, amplitude)); + if let Some(codebook) = &codebooks.get(*codebook_idx as usize) { + let mut coefficients = Vec::with_capacity(fl.floor0_order as usize); + let mut last = 0.0; + loop { + let mut last_new = last; + let temp_vector = try!(rdr.read_huffman_vq(codebook)); + if temp_vector.len() + coefficients.len() < fl.floor0_order as usize { + // Little optimisation: we don't have to care about the >= case here + for &e in temp_vector { + coefficients.push((last + e as f32).cos()); + last_new = e as f32; + } + } else { + for &e in temp_vector { + coefficients.push((last + e as f32).cos()); + last_new = e as f32; + // This rule makes sure that coefficients doesn't get + // larger than floor0_order and saves an allocation + // in this case + if coefficients.len() == fl.floor0_order as usize { + return Ok((coefficients, amplitude)); + } } } + last += last_new; + if coefficients.len() >= fl.floor0_order as usize { + return Ok((coefficients, amplitude)); + } } - last += last_new; - if coefficients.len() >= fl.floor0_order as usize { - return Ok((coefficients, amplitude)); - } + } else { + return Err(FloorSpecialCase::PacketUndecodable); } }, } From 7702526b4e9f5727392bf168ab329cacec146787 Mon Sep 17 00:00:00 2001 From: BenSandeen <12025856+BenSandeen@users.noreply.github.com> Date: Fri, 1 Mar 2019 07:55:37 -0700 Subject: [PATCH 3/4] Hopefully fix compilation error on Rust 1.20.0 --- src/audio.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio.rs b/src/audio.rs index 332424f..fa69985 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -127,7 +127,7 @@ fn floor_zero_decode(rdr :&mut BitpackCursor, codebooks :&[Codebook], // Undecodable per spec None => try!(Err(FloorSpecialCase::PacketUndecodable)), Some(codebook_idx) => { - if let Some(codebook) = &codebooks.get(*codebook_idx as usize) { + if let Some(codebook) = (&codebooks).get(*codebook_idx as usize) { let mut coefficients = Vec::with_capacity(fl.floor0_order as usize); let mut last = 0.0; loop { From 0f6e04f0e2072e33e7d915f7cb59e6151142f1c4 Mon Sep 17 00:00:00 2001 From: BenSandeen <12025856+BenSandeen@users.noreply.github.com> Date: Sat, 2 Mar 2019 13:25:39 -0700 Subject: [PATCH 4/4] Undo previous changes and make fix in `header.rs` --- src/audio.rs | 55 ++++++++++++++++++++++++--------------------------- src/header.rs | 6 +++++- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index fa69985..e625983 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -127,37 +127,34 @@ fn floor_zero_decode(rdr :&mut BitpackCursor, codebooks :&[Codebook], // Undecodable per spec None => try!(Err(FloorSpecialCase::PacketUndecodable)), Some(codebook_idx) => { - if let Some(codebook) = (&codebooks).get(*codebook_idx as usize) { - let mut coefficients = Vec::with_capacity(fl.floor0_order as usize); - let mut last = 0.0; - loop { - let mut last_new = last; - let temp_vector = try!(rdr.read_huffman_vq(codebook)); - if temp_vector.len() + coefficients.len() < fl.floor0_order as usize { - // Little optimisation: we don't have to care about the >= case here - for &e in temp_vector { - coefficients.push((last + e as f32).cos()); - last_new = e as f32; - } - } else { - for &e in temp_vector { - coefficients.push((last + e as f32).cos()); - last_new = e as f32; - // This rule makes sure that coefficients doesn't get - // larger than floor0_order and saves an allocation - // in this case - if coefficients.len() == fl.floor0_order as usize { - return Ok((coefficients, amplitude)); - } - } + let mut coefficients = Vec::with_capacity(fl.floor0_order as usize); + let mut last = 0.0; + let codebook = &codebooks[*codebook_idx as usize]; + loop { + let mut last_new = last; + let temp_vector = try!(rdr.read_huffman_vq(codebook)); + if temp_vector.len() + coefficients.len() < fl.floor0_order as usize { + // Little optimisation: we don't have to care about the >= case here + for &e in temp_vector { + coefficients.push((last + e as f32).cos()); + last_new = e as f32; } - last += last_new; - if coefficients.len() >= fl.floor0_order as usize { - return Ok((coefficients, amplitude)); + } else { + for &e in temp_vector { + coefficients.push((last + e as f32).cos()); + last_new = e as f32; + // This rule makes sure that coefficients doesn't get + // larger than floor0_order and saves an allocation + // in this case + if coefficients.len() == fl.floor0_order as usize { + return Ok((coefficients, amplitude)); + } } } - } else { - return Err(FloorSpecialCase::PacketUndecodable); + last += last_new; + if coefficients.len() >= fl.floor0_order as usize { + return Ok((coefficients, amplitude)); + } } }, } @@ -719,7 +716,7 @@ fn residue_packet_decode_inner(rdr :&mut BitpackCursor, cur_blocksize :u16, } -// Ok means "fine" (or end of packet, but that's "fine" too!), +// Ok means "fine" (or end of packet, but thats "fine" too!), // Err means "not fine" -- the whole packet must be discarded fn residue_packet_decode(rdr :&mut BitpackCursor, cur_blocksize :u16, do_not_decode_flag :&[bool], resid :&Residue, codebooks :&[Codebook]) -> Result, ()> { diff --git a/src/header.rs b/src/header.rs index e4a9e34..cde8ceb 100644 --- a/src/header.rs +++ b/src/header.rs @@ -792,7 +792,11 @@ fn read_floor(rdr :&mut BitpackCursor, codebook_cnt :u16, blocksizes :(u8, u8)) let mut floor0_book_list = Vec::with_capacity( convert_to_usize!(floor0_number_of_books, u8)); for _ in 0 .. floor0_number_of_books { - floor0_book_list.push(try!(rdr.read_u8())); + let value = try!(rdr.read_u8()); + if value > codebook_cnt as u8 { + try!(Err(HeaderReadError::HeaderBadFormat)); + } + floor0_book_list.push(value); } Ok(Floor::TypeZero(FloorTypeZero { floor0_order,