Merge commit '6a6bc43f5f79587b8936334cc0b3a6616f4807ac'
authorHendrik Leppkes <h.leppkes@gmail.com>
Tue, 8 Sep 2015 12:23:53 +0000 (14:23 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Tue, 8 Sep 2015 12:23:53 +0000 (14:23 +0200)
* commit '6a6bc43f5f79587b8936334cc0b3a6616f4807ac':
  dxtory: Factorize slice size checks

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
libavcodec/dxtory.c

@@@ -269,24 -297,12 +297,13 @@@ static int dxtory_decode_v2_565(AVCodec
      dst = pic->data[0];
      for (slice = 0; slice < nslices; slice++) {
          slice_size = bytestream2_get_le32(&gb);
-         if (slice_size > src_size - off) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "invalid slice size %"PRIu32" (only %"PRIu32" bytes left)\n",
-                    slice_size, src_size - off);
-             return AVERROR_INVALIDDATA;
-         }
-         if (slice_size <= 16) {
-             av_log(avctx, AV_LOG_ERROR, "invalid slice size %"PRIu32"\n", slice_size);
-             return AVERROR_INVALIDDATA;
-         }
  
-         if (AV_RL32(src + off) != slice_size - 16) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "Slice sizes mismatch: got %"PRIu32" instead of %"PRIu32"\n",
-                    AV_RL32(src + off), slice_size - 16);
-         }
+         ret = check_slice_size(avctx, src, src_size, slice_size, off);
+         if (ret < 0)
+             return ret;
 -        init_get_bits(&gb2, src + off + 16, (slice_size - 16) * 8);
 +        if ((ret = init_get_bits8(&gb2, src + off + 16, slice_size - 16)) < 0)
 +            return ret;
          dx2_decode_slice_565(&gb2, avctx->width, slice_height, dst,
                               pic->linesize[0], is_565);
  
@@@ -351,25 -367,12 +368,13 @@@ static int dxtory_decode_v2_rgb(AVCodec
      dst = pic->data[0];
      for (slice = 0; slice < nslices; slice++) {
          slice_size = bytestream2_get_le32(&gb);
-         if (slice_size > src_size - off) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "invalid slice size %"PRIu32" (only %"PRIu32" bytes left)\n",
-                    slice_size, src_size - off);
-             return AVERROR_INVALIDDATA;
-         }
-         if (slice_size <= 16) {
-             av_log(avctx, AV_LOG_ERROR, "invalid slice size %"PRIu32"\n",
-                    slice_size);
-             return AVERROR_INVALIDDATA;
-         }
  
-         if (AV_RL32(src + off) != slice_size - 16) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "Slice sizes mismatch: got %"PRIu32" instead of %"PRIu32"\n",
-                    AV_RL32(src + off), slice_size - 16);
-         }
+         ret = check_slice_size(avctx, src, src_size, slice_size, off);
+         if (ret < 0)
+             return ret;
 -        init_get_bits(&gb2, src + off + 16, (slice_size - 16) * 8);
 +        if ((ret = init_get_bits8(&gb2, src + off + 16, slice_size - 16)) < 0)
 +            return ret;
          dx2_decode_slice_rgb(&gb2, avctx->width, slice_height, dst,
                               pic->linesize[0]);
  
@@@ -446,28 -450,16 +451,18 @@@ static int dxtory_decode_v2_410(AVCodec
      V = pic->data[2];
  
      cur_y  = 0;
 -    next_y = ref_slice_height;
      for (slice = 0; slice < nslices; slice++) {
          slice_size   = bytestream2_get_le32(&gb);
 +        next_y = ((slice + 1) * avctx->height) / nslices;
          slice_height = (next_y & ~3) - (cur_y & ~3);
-         if (slice_size > src_size - off) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "invalid slice size %"PRIu32" (only %"PRIu32" bytes left)\n",
-                    slice_size, src_size - off);
-             return AVERROR_INVALIDDATA;
-         }
-         if (slice_size <= 16) {
-             av_log(avctx, AV_LOG_ERROR, "invalid slice size %"PRIu32"\n", slice_size);
-             return AVERROR_INVALIDDATA;
-         }
  
-         if (AV_RL32(src + off) != slice_size - 16) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "Slice sizes mismatch: got %"PRIu32" instead of %"PRIu32"\n",
-                    AV_RL32(src + off), slice_size - 16);
-         }
+         ret = check_slice_size(avctx, src, src_size, slice_size, off);
+         if (ret < 0)
+             return ret;
 -        init_get_bits(&gb2, src + off + 16, (slice_size - 16) * 8);
 +        if ((ret = init_get_bits8(&gb2, src + off + 16, slice_size - 16)) < 0)
 +            return ret;
++
          dx2_decode_slice_410(&gb2, avctx->width, slice_height, Y, U, V,
                               pic->linesize[0], pic->linesize[1],
                               pic->linesize[2]);
@@@ -549,28 -543,16 +544,17 @@@ static int dxtory_decode_v2_420(AVCodec
      V = pic->data[2];
  
      cur_y  = 0;
 -    next_y = ref_slice_height;
      for (slice = 0; slice < nslices; slice++) {
          slice_size   = bytestream2_get_le32(&gb);
 +        next_y = ((slice + 1) * avctx->height) / nslices;
          slice_height = (next_y & ~1) - (cur_y & ~1);
-         if (slice_size > src_size - off) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "invalid slice size %"PRIu32" (only %"PRIu32" bytes left)\n",
-                    slice_size, src_size - off);
-             return AVERROR_INVALIDDATA;
-         }
-         if (slice_size <= 16) {
-             av_log(avctx, AV_LOG_ERROR, "invalid slice size %"PRIu32"\n", slice_size);
-             return AVERROR_INVALIDDATA;
-         }
  
-         if (AV_RL32(src + off) != slice_size - 16) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "Slice sizes mismatch: got %"PRIu32" instead of %"PRIu32"\n",
-                    AV_RL32(src + off), slice_size - 16);
-         }
+         ret = check_slice_size(avctx, src, src_size, slice_size, off);
+         if (ret < 0)
+             return ret;
 -        init_get_bits(&gb2, src + off + 16, (slice_size - 16) * 8);
 +        if ((ret = init_get_bits8(&gb2, src + off + 16, slice_size - 16)) < 0)
 +            return ret;
          dx2_decode_slice_420(&gb2, avctx->width, slice_height, Y, U, V,
                               pic->linesize[0], pic->linesize[1],
                               pic->linesize[2]);
@@@ -646,24 -629,12 +630,13 @@@ static int dxtory_decode_v2_444(AVCodec
  
      for (slice = 0; slice < nslices; slice++) {
          slice_size = bytestream2_get_le32(&gb);
-         if (slice_size > src_size - off) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "invalid slice size %"PRIu32" (only %"PRIu32" bytes left)\n",
-                    slice_size, src_size - off);
-             return AVERROR_INVALIDDATA;
-         }
-         if (slice_size <= 16) {
-             av_log(avctx, AV_LOG_ERROR, "invalid slice size %"PRIu32"\n", slice_size);
-             return AVERROR_INVALIDDATA;
-         }
  
-         if (AV_RL32(src + off) != slice_size - 16) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "Slice sizes mismatch: got %"PRIu32" instead of %"PRIu32"\n",
-                    AV_RL32(src + off), slice_size - 16);
-         }
+         ret = check_slice_size(avctx, src, src_size, slice_size, off);
+         if (ret < 0)
+             return ret;
 -        init_get_bits(&gb2, src + off + 16, (slice_size - 16) * 8);
 +        if ((ret = init_get_bits8(&gb2, src + off + 16, slice_size - 16)) < 0)
 +            return ret;
          dx2_decode_slice_444(&gb2, avctx->width, slice_height, Y, U, V,
                               pic->linesize[0], pic->linesize[1],
                               pic->linesize[2]);