avcodec/fic: fix slice checks
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 15 Feb 2014 16:19:32 +0000 (17:19 +0100)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Mon, 21 Apr 2014 18:56:17 +0000 (14:56 -0400)
fix integer overflows

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
libavcodec/fic.c

index 90fda91..9453941 100644 (file)
@@ -263,8 +263,8 @@ static int fic_decode_frame(AVCodecContext *avctx, void *data,
     }
 
     for (slice = 0; slice < nslices; slice++) {
     }
 
     for (slice = 0; slice < nslices; slice++) {
-        int slice_off = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4);
-        int slice_size;
+        unsigned slice_off = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4);
+        unsigned slice_size;
         int y_off   = ctx->slice_h * slice;
         int slice_h = ctx->slice_h;
 
         int y_off   = ctx->slice_h * slice;
         int slice_h = ctx->slice_h;
 
@@ -279,11 +279,11 @@ static int fic_decode_frame(AVCodecContext *avctx, void *data,
             slice_size = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4 + 4);
         }
 
             slice_size = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4 + 4);
         }
 
-        slice_size -= slice_off;
-
-        if (slice_off > msize || slice_off + slice_size > msize)
+        if (slice_size < slice_off || slice_size > msize)
             continue;
 
             continue;
 
+        slice_size -= slice_off;
+
         ctx->slice_data[slice].src      = sdata + slice_off;
         ctx->slice_data[slice].src_size = slice_size;
         ctx->slice_data[slice].slice_h  = slice_h;
         ctx->slice_data[slice].src      = sdata + slice_off;
         ctx->slice_data[slice].src_size = slice_size;
         ctx->slice_data[slice].slice_h  = slice_h;