avi: skip list chunks correctly
authorKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 8 Jun 2017 16:05:26 +0000 (18:05 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 8 Jun 2017 16:05:26 +0000 (18:05 +0200)
src/demuxers/avi.rs

index 2a3f8f0bb49fc3f84680c7002d4139b5794b1386..2d2a261f591bd2c968b3a9ad774a872d7ddae7d3 100644 (file)
@@ -139,7 +139,8 @@ impl<'a> AVIDemuxer<'a> {
         if RIFFTag::Chunk(tag) == end_tag {
             return Ok((size, true));
         }
-        let ltag = if is_list_tag(tag) { self.src.read_u32be()? } else { 0 };
+        let is_list = is_list_tag(tag);
+        let ltag = if is_list { self.src.read_u32be()? } else { 0 };
         if RIFFTag::List(tag, ltag) == end_tag {
             return Ok((size, true));
         }
@@ -170,7 +171,12 @@ impl<'a> AVIDemuxer<'a> {
                 return Ok((size + 8, false));
             }
         }
-        self.src.read_skip(size)?;
+        if !is_list {
+            self.src.read_skip(size)?;
+        } else {
+            if size < 4 { return Err(InvalidData); }
+            self.src.read_skip(size - 4)?;
+        }
         if (size & 1) == 1 { self.src.read_skip(1)?; }
         return Ok((size + 8, false));
     }