diff options
Diffstat (limited to 'libavcodec/eatgv.c')
-rw-r--r-- | libavcodec/eatgv.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/libavcodec/eatgv.c b/libavcodec/eatgv.c index 1e0ec60bc5..54074b37ff 100644 --- a/libavcodec/eatgv.c +++ b/libavcodec/eatgv.c @@ -2,20 +2,20 @@ * Electronic Arts TGV Video Decoder * Copyright (c) 2007-2008 Peter Ross * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -57,6 +57,7 @@ static av_cold int tgv_decode_init(AVCodecContext *avctx) s->avctx = avctx; avctx->time_base = (AVRational){1, 15}; avctx->pix_fmt = AV_PIX_FMT_PAL8; + avcodec_get_frame_defaults(&s->last_frame); return 0; } @@ -76,7 +77,7 @@ static int unpack(const uint8_t *src, const uint8_t *src_end, else src += 2; - if (src + 3 > src_end) + if (src_end - src < 3) return AVERROR_INVALIDDATA; size = AV_RB24(src); src += 3; @@ -151,7 +152,7 @@ static int tgv_decode_inter(TgvContext *s, AVFrame *frame, int mvbits; const uint8_t *blocks_raw; - if (buf + 12 > buf_end) + if(buf_end - buf < 12) return AVERROR_INVALIDDATA; num_mvs = AV_RL16(&buf[0]); @@ -180,7 +181,7 @@ static int tgv_decode_inter(TgvContext *s, AVFrame *frame, /* read motion vectors */ mvbits = (num_mvs * 2 * 10 + 31) & ~31; - if (buf + (mvbits >> 3) + 16 * num_blocks_raw + 8 * num_blocks_packed > buf_end) + if (buf_end - buf < (mvbits>>3) + 16*num_blocks_raw + 8*num_blocks_packed) return AVERROR_INVALIDDATA; init_get_bits(&gb, buf, mvbits); @@ -220,8 +221,10 @@ static int tgv_decode_inter(TgvContext *s, AVFrame *frame, int my = y * 4 + s->mv_codebook[vector][1]; if (mx < 0 || mx + 4 > s->avctx->width || - my < 0 || my + 4 > s->avctx->height) + my < 0 || my + 4 > s->avctx->height) { + av_log(s->avctx, AV_LOG_ERROR, "MV %d %d out of picture\n", mx, my); continue; + } src = s->last_frame.data[0] + mx + my * s->last_frame.linesize[0]; src_stride = s->last_frame.linesize[0]; @@ -256,12 +259,15 @@ static int tgv_decode_frame(AVCodecContext *avctx, AVFrame *frame = data; int chunk_type, ret; + if (buf_end - buf < EA_PREAMBLE_SIZE) + return AVERROR_INVALIDDATA; + chunk_type = AV_RL32(&buf[0]); buf += EA_PREAMBLE_SIZE; if (chunk_type == kVGT_TAG) { int pal_count, i; - if (buf + 12 > buf_end) { + if(buf_end - buf < 12) { av_log(avctx, AV_LOG_WARNING, "truncated header\n"); return AVERROR_INVALIDDATA; } @@ -276,8 +282,8 @@ static int tgv_decode_frame(AVCodecContext *avctx, pal_count = AV_RL16(&buf[6]); buf += 12; - for (i = 0; i < pal_count && i < AVPALETTE_COUNT && buf + 2 < buf_end; i++) { - s->palette[i] = AV_RB24(buf); + for(i = 0; i < pal_count && i < AVPALETTE_COUNT && buf_end - buf >= 3; i++) { + s->palette[i] = 0xFFU << 24 | AV_RB24(buf); buf += 3; } } |