X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fshorten.c;h=c93ba6b0269a6b325e48d4a8eb9743a902fc2496;hb=f963f80399deb1a2b44c1bac3af7123e8a0c9e46;hp=6a2f56e3c3176f0e8d8a77628beafeafbea6e797;hpb=b2bed9325dbd6be0da1d91ffed3f513c40274fd2;p=ffmpeg diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c index 6a2f56e3c31..c93ba6b0269 100644 --- a/libavcodec/shorten.c +++ b/libavcodec/shorten.c @@ -119,9 +119,7 @@ static av_cold int shorten_decode_init(AVCodecContext *avctx) static int allocate_buffers(ShortenContext *s) { - int i, chan; - int *coeffs; - void *tmp_ptr; + int i, chan, err; for (chan = 0; chan < s->channels; chan++) { if (FFMAX(1, s->nmean) >= UINT_MAX / sizeof(int32_t)) { @@ -135,26 +133,21 @@ static int allocate_buffers(ShortenContext *s) return AVERROR_INVALIDDATA; } - tmp_ptr = - av_realloc(s->offset[chan], sizeof(int32_t) * FFMAX(1, s->nmean)); - if (!tmp_ptr) - return AVERROR(ENOMEM); - s->offset[chan] = tmp_ptr; + if ((err = av_reallocp(&s->offset[chan], + sizeof(int32_t) * + FFMAX(1, s->nmean))) < 0) + return err; - tmp_ptr = av_realloc(s->decoded_base[chan], (s->blocksize + s->nwrap) * - sizeof(s->decoded_base[0][0])); - if (!tmp_ptr) - return AVERROR(ENOMEM); - s->decoded_base[chan] = tmp_ptr; + if ((err = av_reallocp(&s->decoded_base[chan], (s->blocksize + s->nwrap) * + sizeof(s->decoded_base[0][0]))) < 0) + return err; for (i = 0; i < s->nwrap; i++) s->decoded_base[chan][i] = 0; s->decoded[chan] = s->decoded_base[chan] + s->nwrap; } - coeffs = av_realloc(s->coeffs, s->nwrap * sizeof(*s->coeffs)); - if (!coeffs) - return AVERROR(ENOMEM); - s->coeffs = coeffs; + if ((err = av_reallocp(&s->coeffs, s->nwrap * sizeof(*s->coeffs))) < 0) + return err; return 0; } @@ -273,7 +266,8 @@ static void output_buffer(int16_t **samples, int nchan, int blocksize, } } -static const int fixed_coeffs[3][3] = { +static const int fixed_coeffs[][3] = { + { 0, 0, 0 }, { 1, 0, 0 }, { 2, -1, 0 }, { 3, -3, 1 } @@ -302,7 +296,12 @@ static int decode_subframe_lpc(ShortenContext *s, int command, int channel, } else { /* fixed LPC coeffs */ pred_order = command; - coeffs = fixed_coeffs[pred_order - 1]; + if (pred_order >= FF_ARRAY_ELEMS(fixed_coeffs)) { + av_log(s->avctx, AV_LOG_ERROR, "invalid pred_order %d\n", + pred_order); + return AVERROR_INVALIDDATA; + } + coeffs = fixed_coeffs[pred_order]; qshift = 0; } @@ -432,7 +431,7 @@ static int shorten_decode_frame(AVCodecContext *avctx, void *data, void *tmp_ptr; s->max_framesize = 1024; // should hopefully be enough for the first header tmp_ptr = av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, - s->max_framesize); + s->max_framesize + FF_INPUT_BUFFER_PADDING_SIZE); if (!tmp_ptr) { av_log(avctx, AV_LOG_ERROR, "error allocating bitstream buffer\n"); return AVERROR(ENOMEM); @@ -511,6 +510,8 @@ static int shorten_decode_frame(AVCodecContext *avctx, void *data, break; case FN_BITSHIFT: s->bitshift = get_ur_golomb_shorten(&s->gb, BITSHIFTSIZE); + if (s->bitshift < 0) + return AVERROR_INVALIDDATA; break; case FN_BLOCKSIZE: { unsigned blocksize = get_uint(s, av_log2(s->blocksize));