h264_cavlc: fix assertion failure due to reading too long vlc
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 28 Mar 2013 02:16:01 +0000 (03:16 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 15 Jan 2014 23:48:58 +0000 (00:48 +0100)
Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 10ece44d0948b44b062d09319052d09d14f7bfdb)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/h264_cavlc.c

index 089d41a..1e979e5 100644 (file)
@@ -549,9 +549,15 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in
                 if(prefix<15){
                     level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
                 }else{
-                    level_code = (15<<suffix_length) + get_bits(gb, prefix-3);
-                    if(prefix>=16)
+                    level_code = 15<<suffix_length;
+                    if (prefix>=16) {
+                        if(prefix > 25+3){
+                            av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
+                            return AVERROR_INVALIDDATA;
+                        }
                         level_code += (1<<(prefix-3))-4096;
+                    }
+                    level_code += get_bits(gb, prefix-3);
                 }
                 mask= -(level_code&1);
                 level_code= (((2+level_code)>>1) ^ mask) - mask;