[FFmpeg-devel] [PATCH] IFF: Add error checking to byterun1 decoder
Sebastian Vater
cdgs.basty
Wed May 26 17:24:03 CEST 2010
Ronald S. Bultje a ?crit :
> Hi,
>
> On Wed, May 26, 2010 at 9:21 AM, Sebastian Vater
> <cdgs.basty at googlemail.com> wrote:
>
>> Wow! Never thought that adding normal error checking can actually make
>> code run faster instead of slower.
>>
>> BTW, with the last patch I also forgot to add doxygen new avctx
>> parameter, which I fixed with this patch, too.
>>
> [..]
>
>> -static int decode_byterun(uint8_t *dst, int dst_size,
>> +static int decode_byterun(AVCodecContext *const avctx, uint8_t *dst, int dst_size,
>> const uint8_t *buf, const uint8_t *const buf_end) {
>> const uint8_t *const buf_start = buf;
>> - unsigned x;
>> - for (x = 0; x < dst_size && buf < buf_end;) {
>> - unsigned length;
>> + if (buf >= buf_end) {
>> + av_log(avctx, AV_LOG_ERROR, "IFF byterun1 stream buffer overflow\n");
>> + return AVERROR_INVALIDDATA;
>> + }
>> + do {
>>
>
> This is confusing. You're movng from a for() to a do{}while so the
> check is not done in the beginning, but as a result you add an extra
> check. I'd keep the loop as it was before.
>
Just like all the other functions starting with decode ;-)
So they're all consistent now in this regard.
That was the reason I did it here, also.
Since dst_size can be never <= 0 in the first run (just like in
decodeplane8/32) because avctx->width is > 0 always now (we were adding
a check for that some time ago, right).
The old routine just had the for because it used FFMIN instead of proper
error handling.
Remaining the last check, length > remaining buffer, these have to be
done in dependency if we do a memcpy / memset or noop.
Like FFMIN and FFMIN3 were used in the old version depending on what we do.
BTW, counting backward with a do ... while here makes the error checking
simpler (note that the if before memcpy/memset part uses dst_size, i.e.
remaining destination allowed to fill up). so it's easier to read:
if (dst_size > length)
instead of:
if (dst_size - x > length)
right?
> Then in the loop, you can add more if (buf>=end) break; checks, and at
> the end of the function you can add the actual error message which is
> triplicated throughout the loop now (if (buf >= end) { av_log();
> return error; }
>
That sounds much better, indeed, yes.
Another possibility would be though to change the error messages in each
(i.e. make them more detailed), what do you think of this?
--
Best regards,
:-) Basty/CDGS (-:
More information about the ffmpeg-devel
mailing list