[FFmpeg-devel] stsz overflow

Baptiste Coudurier baptiste.coudurier
Tue Aug 25 20:19:29 CEST 2009


On 8/25/2009 11:11 AM, Reimar D?ffinger wrote:
> On Tue, Aug 25, 2009 at 10:16:52AM -0700, Frank Barchard wrote:
>> On Tue, Aug 25, 2009 at 9:16 AM, Reimar D?ffinger
>> <Reimar.Doeffinger at gmx.de>wrote:
>>
>>> On Tue, Aug 25, 2009 at 09:11:21AM -0700, Baptiste Coudurier wrote:
>>>>> Wow, what a mess (IMO). I think we are already at the point where it
>>>>> would be simpler to just get rid of that buffer and directly read the
>>>>> values "one by one" from the file.
>>>> No, it was decided to be done that way when the patch was submitted.
>>> Obviously the review at that time did not take into account the
>>> additional code and complexity of avoiding buffer overflows, which
>>> unless someone comes up with a cleaner check is a really good reason
>>> to reconsider that decision.
>>
>> Here is the simplest change that addresses the math overflow.  It limits
>> stsz to 134,217,728 entries.

Looks reasonable.

>> Index: libavformat/mov.c
>> ===================================================================
>> --- libavformat/mov.c   (revision 19697)
>> +++ libavformat/mov.c   (working copy)
>> @@ -1256,7 +1256,7 @@
>>           return -1;
>>       }
>>
>> -    if(entries>= UINT_MAX / sizeof(int))
>> +    if(entries>= UINT_MAX / 32)  /* avoids buffer overrun */
>>           return -1;
>
> Seems reasonable to me, except for the comment.
> A buffer overrun/overflow is only the secondary effect.
> The right comment should be something like "avoids integer
> overflow in multiplication with field_size".
> Particularly mentioning field_size may reduce the risk of forgetting
> to change this if ever e.g. field_size == 64 should become possible.

I agree.

> Or
> if (entries>= UINT_MAX / sizeof(int) || entries>= (UINT_MAX - 4) / field_size)
> as a compromise.

This one seems good to me as well.

> Anyway, I think we have enough possibilities to choose from, just
> need to pick one and go with it.
> Though I still think that using get_bits isn't worth the 13 lines of
> code it needs - though the alternative is a bit ugly as well.

Yes, I've no problem with the other approach not using a buffer, if 
others prefer it.

-- 
Baptiste COUDURIER                              GnuPG Key Id: 0x5C1ABAAA
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer                                  http://www.ffmpeg.org



More information about the ffmpeg-devel mailing list