]> git.nihav.org Git - nihav.git/blobdiff - nihav-rad/src/codecs/smacker.rs
smacker: add forgotten recursion depth check
[nihav.git] / nihav-rad / src / codecs / smacker.rs
index c1b9fd6cae3270c49165960d10482f6c1573dc68..7ecd4436b074063c67acd37cc0a98bc7ed6aff90 100644 (file)
@@ -94,6 +94,7 @@ const SMK_LAST_UNINIT: usize = 0xFFFFFFFF;
 impl SmackerTree16Builder {
     fn get_tree16(&mut self, br: &mut BitReader, tree: &mut SmackerTree16, depth: usize) -> DecoderResult<u32> {
         validate!(tree.tree.len() < self.nsyms);
+        validate!(depth <= 32);
         if !br.read_bool()? {
             let lo = br.read_tree8(&self.tree_lo)?;
             let hi = br.read_tree8(&self.tree_hi)?;
@@ -138,7 +139,7 @@ impl SmackerTree16 {
 
         let mut esc: [u32; 3] = [0; 3];
         for i in 0..esc.len() {
-            esc[i] = br.read(16)? as u32;
+            esc[i] = br.read(16)?;
         }
 
         let nsyms = (((size + 3) >> 2) + 4) as usize;
@@ -573,7 +574,7 @@ impl NADecoder for SmackerAudioDecoder {
                     let mut pred: [u8; 2] = [ pred1, pred0 ];
                     for ch in 0..2 { dst[ch] = pred[ch]; }
                     for i in 2..unp_size {
-                        let diff = br.read_tree8(&trees[i & 1])? as u8;
+                        let diff = br.read_tree8(&trees[i & 1])?;
                         pred[i & 1] = pred[i & 1].wrapping_add(diff);
                         dst[i] = pred[i & 1];
                     }
@@ -583,7 +584,7 @@ impl NADecoder for SmackerAudioDecoder {
                     let mut pred                = br.read(8)? as u8;
                     dst[0] = pred;
                     for i in 1..unp_size {
-                        let diff = br.read_tree8(&tree)? as u8;
+                        let diff = br.read_tree8(&tree)?;
                         pred = pred.wrapping_add(diff);
                         dst[i] = pred;
                     }