Commit c8b5c4d2 authored by Justin Ruggles's avatar Justin Ruggles

mpc7: check output buffer size before decoding

parent fac6b7f9
...@@ -197,7 +197,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, ...@@ -197,7 +197,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
int i, ch; int i, ch;
int mb = -1; int mb = -1;
Band *bands = c->bands; Band *bands = c->bands;
int off; int off, out_size;
int bits_used, bits_avail; int bits_used, bits_avail;
memset(bands, 0, sizeof(bands)); memset(bands, 0, sizeof(bands));
...@@ -205,6 +205,12 @@ static int mpc7_decode_frame(AVCodecContext * avctx, ...@@ -205,6 +205,12 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size);
} }
out_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4;
if (*data_size < out_size) {
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
return AVERROR(EINVAL);
}
bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE); bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE);
c->dsp.bswap_buf((uint32_t*)bits, (const uint32_t*)(buf + 4), (buf_size - 4) >> 2); c->dsp.bswap_buf((uint32_t*)bits, (const uint32_t*)(buf + 4), (buf_size - 4) >> 2);
init_get_bits(&gb, bits, (buf_size - 4)* 8); init_get_bits(&gb, bits, (buf_size - 4)* 8);
...@@ -277,7 +283,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, ...@@ -277,7 +283,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
*data_size = 0; *data_size = 0;
return buf_size; return buf_size;
} }
*data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; *data_size = out_size;
return buf_size; return buf_size;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment