aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2015-03-05 22:48:28 +0100
committerMichael Niedermayer <michaelni@gmx.at>2015-03-21 01:52:52 +0100
commit57c7922331d5f2c0999046845bd9bf24ac74c2b7 (patch)
treeefd7811c9eab906dfa3c85e63456196b25af0c26
parent73dd8f0a2431851d99f3a94acfd608a2e820b6ab (diff)
downloadffmpeg-57c7922331d5f2c0999046845bd9bf24ac74c2b7.tar.gz
webp: ensure that each transform is only used once
According to the WebP Lossless Bitstream Specification "each transform is allowed to be used only once". If a transform is more than once this can lead to memory corruption. Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit c089e720c1b753790c746a13053636d7facf6bf0) Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/webp.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libavcodec/webp.c b/libavcodec/webp.c
index 4b1c8e7f8b..802b03c826 100644
--- a/libavcodec/webp.c
+++ b/libavcodec/webp.c
@@ -1099,7 +1099,7 @@ static int vp8_lossless_decode_frame(AVCodecContext *avctx, AVFrame *p,
unsigned int data_size, int is_alpha_chunk)
{
WebPContext *s = avctx->priv_data;
- int w, h, ret, i;
+ int w, h, ret, i, used;
if (!is_alpha_chunk) {
s->lossless = 1;
@@ -1149,8 +1149,16 @@ static int vp8_lossless_decode_frame(AVCodecContext *avctx, AVFrame *p,
/* parse transformations */
s->nb_transforms = 0;
s->reduced_width = 0;
+ used = 0;
while (get_bits1(&s->gb)) {
enum TransformType transform = get_bits(&s->gb, 2);
+ if (used & (1 << transform)) {
+ av_log(avctx, AV_LOG_ERROR, "Transform %d used more than once\n",
+ transform);
+ ret = AVERROR_INVALIDDATA;
+ goto free_and_return;
+ }
+ used |= (1 << transform);
s->transforms[s->nb_transforms++] = transform;
switch (transform) {
case PREDICTOR_TRANSFORM: