aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-02-24 12:57:08 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-02-24 13:08:42 +0100
commit714ff44858a07578e592dfabd9e1f0a5edbf80bf (patch)
tree4cb4d03407e52ad0ca4a170eff7e95c1eadf095d
parent4ba35194a9d79b80a606aafe8744d82de5b4bcf4 (diff)
parent067432c1c95882c7221e694f33d9f3bdbe46de7f (diff)
downloadffmpeg-714ff44858a07578e592dfabd9e1f0a5edbf80bf.tar.gz
Merge commit '067432c1c95882c7221e694f33d9f3bdbe46de7f'
* commit '067432c1c95882c7221e694f33d9f3bdbe46de7f': loco: check that there is data left after decoding a plane. lagarith: avoid infinite loop in lag_rac_refill() Conflicts: libavcodec/loco.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/lagarithrac.h3
-rw-r--r--libavcodec/loco.c9
2 files changed, 9 insertions, 3 deletions
diff --git a/libavcodec/lagarithrac.h b/libavcodec/lagarithrac.h
index d8d38f2054..9892d11fb3 100644
--- a/libavcodec/lagarithrac.h
+++ b/libavcodec/lagarithrac.h
@@ -107,6 +107,9 @@ static inline uint8_t lag_get_rac(lag_rac *l)
l->range -= range_scaled * l->prob[255];
}
+ if (!l->range)
+ l->range = 0x80;
+
l->low -= range_scaled * l->prob[val];
return val;
diff --git a/libavcodec/loco.c b/libavcodec/loco.c
index 9958c148c7..559f7c2026 100644
--- a/libavcodec/loco.c
+++ b/libavcodec/loco.c
@@ -190,7 +190,7 @@ static int decode_frame(AVCodecContext *avctx,
p->key_frame = 1;
#define ADVANCE_BY_DECODED do { \
- if (decoded < 0) goto stop; \
+ if (decoded < 0 || decoded >= buf_size) goto buf_too_small; \
buf += decoded; buf_size -= decoded; \
} while(0)
switch(l->mode) {
@@ -224,7 +224,8 @@ static int decode_frame(AVCodecContext *avctx,
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_CRGBA: case LOCO_RGBA:
+ case LOCO_CRGBA:
+ case LOCO_RGBA:
decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height,
-p->linesize[0], buf, buf_size, 4);
ADVANCE_BY_DECODED;
@@ -238,12 +239,14 @@ static int decode_frame(AVCodecContext *avctx,
-p->linesize[0], buf, buf_size, 4);
break;
}
-stop:
*got_frame = 1;
*(AVFrame*)data = l->pic;
return buf_size < 0 ? -1 : avpkt->size - 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)