rv10: verify slice offsets against buffer size
authorJanne Grunau <janne-libav@jannau.net>
Mon, 23 Jan 2012 19:57:04 +0000 (20:57 +0100)
committerJanne Grunau <janne-libav@jannau.net>
Tue, 24 Jan 2012 01:16:02 +0000 (02:16 +0100)
Found by John Villamil <johnv@matasano.com> in fuzzed rv20 in mkv files.

libavcodec/rv10.c

index 1d78c92..9f2fe77 100644 (file)
@@ -647,9 +647,12 @@ static int rv10_decode_frame(AVCodecContext *avctx,
         slice_count = avctx->slice_count;
 
     for(i=0; i<slice_count; i++){
-        int offset= get_slice_offset(avctx, slices_hdr, i);
+        unsigned offset = get_slice_offset(avctx, slices_hdr, i);
         int size, size2;
 
+        if (offset >= buf_size)
+            return AVERROR_INVALIDDATA;
+
         if(i+1 == slice_count)
             size= buf_size - offset;
         else
@@ -660,6 +663,10 @@ static int rv10_decode_frame(AVCodecContext *avctx,
         else
             size2= get_slice_offset(avctx, slices_hdr, i+2) - offset;
 
+        if (size <= 0 || size2 <= 0 ||
+            offset + FFMAX(size, size2) > buf_size)
+            return AVERROR_INVALIDDATA;
+
         if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size)
             i++;
     }