aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2015-04-28 11:13:43 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-06-10 02:13:10 +0200
commite6cc6a08d9938c9c8dd2efa682112d7ca91a5512 (patch)
tree27085594db6e801a6ff2009489cd6a8b79f2a70d
parent57208a0999a0cc7377187bd7f6e23904133b5d59 (diff)
downloadffmpeg-e6cc6a08d9938c9c8dd2efa682112d7ca91a5512.tar.gz
apedec: prevent out of array writes in decode_array_0000
s->decoded_buffer is allocated with a min_size of: 2 * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer) Then it is assigned to s->decoded[0] (and s->decoded_buffer + FFALIGN(blockstodecode, 8) to s->decoded[1]) and passed as out buffer to decode_array_0000. In this function 64 elements of the out buffer are written unconditionally and outside the array if blockstodecode is too small. This causes memory corruption, leading to segmentation faults or other crashes. Thus change decode_array_0000 to write at most blockstodecode elements of the out buffer. Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit 699341d647f7af785fb8ceed67604467b0b9ab12) Conflicts: libavcodec/apedec.c Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/apedec.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index ae3ae64e00..dab5c34979 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -598,12 +598,12 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
int ksummax, ksummin;
rice->ksum = 0;
- for (i = 0; i < 5; i++) {
+ for (i = 0; i < FFMIN(blockstodecode, 5); i++) {
out[i] = get_rice_ook(&ctx->gb, 10);
rice->ksum += out[i];
}
rice->k = av_log2(rice->ksum / 10) + 1;
- for (; i < 64; i++) {
+ for (; i < FFMIN(blockstodecode, 64); i++) {
out[i] = get_rice_ook(&ctx->gb, rice->k);
rice->ksum += out[i];
rice->k = av_log2(rice->ksum / ((i + 1) * 2)) + 1;