summaryrefslogtreecommitdiff
path: root/libavcodec/loco.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2013-02-14 09:08:35 +0100
committerAnton Khirnov <anton@khirnov.net>2013-02-23 09:20:42 +0100
commit067432c1c95882c7221e694f33d9f3bdbe46de7f (patch)
treee4dfc3dbd1b6eaa0d1af3a8d01e6a8bb7dcc89f3 /libavcodec/loco.c
parentde6dfa2bb82df916a67e5036b0ef96a944781ed3 (diff)
loco: check that there is data left after decoding a plane.
CC:libav-stable@libav.org
Diffstat (limited to 'libavcodec/loco.c')
-rw-r--r--libavcodec/loco.c30
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)