diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-02-14 09:08:35 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-02-23 09:20:42 +0100 |
commit | 067432c1c95882c7221e694f33d9f3bdbe46de7f (patch) | |
tree | e4dfc3dbd1b6eaa0d1af3a8d01e6a8bb7dcc89f3 | |
parent | de6dfa2bb82df916a67e5036b0ef96a944781ed3 (diff) | |
download | ffmpeg-067432c1c95882c7221e694f33d9f3bdbe46de7f.tar.gz |
loco: check that there is data left after decoding a plane.
CC:libav-stable@libav.org
-rw-r--r-- | libavcodec/loco.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libavcodec/loco.c b/libavcodec/loco.c index d2b2e88f90..b1ad41ae46 100644 --- a/libavcodec/loco.c +++ b/libavcodec/loco.c @@ -190,43 +190,70 @@ static int decode_frame(AVCodecContext *avctx, case LOCO_CYUY2: case LOCO_YUY2: case LOCO_UYVY: decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height, p->linesize[0], buf, buf_size, 1); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height, p->linesize[1], buf, buf_size, 1); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height, p->linesize[2], buf, buf_size, 1); break; case LOCO_CYV12: case LOCO_YV12: decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height, p->linesize[0], buf, buf_size, 1); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height / 2, p->linesize[2], buf, buf_size, 1); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height / 2, p->linesize[1], buf, buf_size, 1); break; case LOCO_CRGB: case LOCO_RGB: decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height, -p->linesize[0], buf, buf_size, 3); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 1, avctx->width, avctx->height, -p->linesize[0], buf, buf_size, 3); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 2, avctx->width, avctx->height, -p->linesize[0], buf, buf_size, 3); break; case LOCO_RGBA: decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height, p->linesize[0], buf, buf_size, 4); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[0] + 1, avctx->width, avctx->height, p->linesize[0], buf, buf_size, 4); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[0] + 2, avctx->width, avctx->height, p->linesize[0], buf, buf_size, 4); + if (decoded >= buf_size) + goto buf_too_small; buf += decoded; buf_size -= decoded; + decoded = loco_decode_plane(l, p->data[0] + 3, avctx->width, avctx->height, p->linesize[0], buf, buf_size, 4); break; @@ -236,6 +263,9 @@ static int decode_frame(AVCodecContext *avctx, *(AVFrame*)data = l->pic; return buf_size; +buf_too_small: + av_log(avctx, AV_LOG_ERROR, "Input data too small.\n"); + return AVERROR(EINVAL); } static av_cold int decode_init(AVCodecContext *avctx) |