[FFmpeg-devel] [libav-devel] Re: [PATCH] apedec: ensure blockstodecode is large enough

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Tue Apr 28 15:21:52 CEST 2015


On 28.04.2015 14:35, Luca Barbato wrote:
> On 27/04/15 23:56, Andreas Cadhalpun wrote:
>> 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], which is 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 blocksdecode is too small.
>>
>> This causes memory corruption, leading to segmentation faults or other crashes.
>>
>> Thus check that FFALIGN(blockstodecode, 8) is at least 32, i. e. the
>> decoded_buffer has at least 64 components.
>>
>> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
>> ---
>>  libavcodec/apedec.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
>> index 536361c..06f3d3f 100644
>> --- a/libavcodec/apedec.c
>> +++ b/libavcodec/apedec.c
>> @@ -1481,6 +1481,12 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
>>      if (s->fileversion < 3930)
>>          blockstodecode = s->samples;
>>  
>> +    if (FFALIGN(blockstodecode, 8) < 32) {
>> +        av_log(avctx, AV_LOG_ERROR, "Too few blocks to decode %d (< 32)\n",
>> +               FFALIGN(blockstodecode, 8));
>> +        return AVERROR_INVALIDDATA;
>> +    }
>> +
>>      /* reallocate decoded sample buffer if needed */
>>      av_fast_malloc(&s->decoded_buffer, &s->decoded_size,
>>                     2 * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer));
>>
> 
> I'd just error out for `(s->fileversion < 3860 && nblocks <
> MIN_BLOCKS_0000)`, that function needs at least 64 blocks.

I think it's better to change the function not to need 64 blocks,
as in the second patch I sent.

Best regards,
Andreas



More information about the ffmpeg-devel mailing list