Improved test for fishy redundancy length
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 14 Oct 2011 00:12:05 +0000 (20:12 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 14 Oct 2011 00:12:05 +0000 (20:12 -0400)
src/opus_decoder.c

index 76b0702..3f965bd 100644 (file)
@@ -334,7 +334,9 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
             /* redundancy_bytes will be at least two, in the non-hybrid case due to the ec_tell() check above */
             redundancy_bytes = mode==MODE_HYBRID ? (opus_int32)ec_dec_uint(&dec, 256)+2 : len-((ec_tell(&dec)+7)>>3);
             len -= redundancy_bytes;
-            if (len<0)
+            /* This is a sanity check. It should never happen for a valid packet,
+               so the exact behaviour is not normative. */
+            if (len*8 < ec_tell(&dec))
             {
                len=0;
                redundancy_bytes=0;