[FFmpeg-devel] [PATCH] Fix non-rounding up to next 16-bit aligned bug in IFF decoder

Sebastian Vater cdgs.basty
Wed Apr 28 15:51:26 CEST 2010


Ronald S. Bultje a ?crit :
> Hi,
>
> On Wed, Apr 28, 2010 at 7:30 AM, Sebastian Vater
> <cdgs.basty at googlemail.com> wrote:
>   
>> I have fixed the wrong IFF decoding issue in the IFF decoder.
>>
>> The reason is that the IFF docs say that each line in the BODY chunk has
>> it's width rounded up to next 16-bit boundary, such that each new line
>> begins on a word boundary (address divisible by 2).
>>     
> [..]
>   
>> +    s->planesize = ((avctx->width + 15) >> 4) * 2;
>>     
>
> This is not how people commonly round up to 2. Most people do
> (x+1)&~1, so you could do:
>
> ((width+15)>>4)<<1
>
> or (which is what most people do, so I'd prefer this):
>
> ((width+15)>>3)&~1
>   

Fixed by applying & ~1.

> But both are fine. And add a comment what this does, e.g. "/* round up
> width to word-boundary */" or so, for the unsuspecting reader.
>   

Fixed.

> The rest of the patch is unrelated to this change and should be
> reviewed separately.
>
>   
>> -    const unsigned b = (buf_size * 8) + bps - 1;
>> +    const uint8_t *end = dst + (buf_size * 8);
>>     
>
> I'm not convinced that is correct. "It doesn't change the output of my
> files" isn't a good enough reason. You're changing the math so it will
> either get worse or better, and for the "better" part it'd need to fix
> a bug or you'd need to show the documentation pointing out that this
> is better.
>   

I can convince you this is correct.

If you look carefully at this code, you will notice that + bps - 1 is
not just unnecessary but also will cause buffer overflow with new width
calculation (remember it rounds up and thus buf_size will get larger)!

Proof with this patch applied:
Let width be 1 and bps be 8.

buf_size will be (1 + 15) >> 4 = 1;

thus end will become = dst + 8;

Therefore dp8 loop will run exactly twice (reading 4 bits each).

Proff w/o this patch applied:
buf_size will be (1 + 15) >> 4;

thus end will become = dst + 8 + 7 (bps - 1) = dst + 15.

Therefore dp8 loop will run 4 times (reading 4 bits each) and thus write
a width of 2 effectively (causing a buffer overflow on last line).

So this will an trigger error which occurs with the new uprounding code!

q.e.d

New patch attached for & ~1 change and added comment.

-- 

Best regards,
                   :-) Basty/CDGS (-:

-------------- next part --------------
A non-text attachment was scrubbed...
Name: iff-decoder-fix.patch
Type: text/x-patch
Size: 1571 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100428/8a527d61/attachment.bin>



More information about the ffmpeg-devel mailing list