[FFmpeg-devel] [PATCH] Workaround for MPEG-TS crashes

Baptiste Coudurier baptiste.coudurier
Tue Sep 15 03:45:36 CEST 2009


Hi Michael,

On 09/14/2009 06:14 PM, Michael Niedermayer wrote:
> On Mon, Sep 14, 2009 at 11:52:39AM -0700, Baptiste Coudurier wrote:
>> Hi,
>>
>> On 09/14/2009 10:25 AM, Dan Dennedy wrote:
>>> Hi
>>>
>>> On Sun, Sep 13, 2009 at 3:00 AM, Ivan Schreter<schreter at gmx.net>   wrote:
>>>> Hi Baptiste,
>>>>
>>>> several people reported crashes when working with MPEG-TS files. I
>>>> suppose,
>>>> those files are either really or subtly broken and MPEG-TS format handler
>>>> doesn't handle them gracefully.
>>>>
>>>> With this patch, the crashes in the samples I have seem to be gone:
>>>>
>>>
>>> In addition, I ran into some small negative lengths passed to memcpy:
>>>
>>> Index: libavformat/mpegts.c
>>> ===================================================================
>>> --- libavformat/mpegts.c        (revision 19804)
>>> +++ libavformat/mpegts.c        (working copy)
>>> @@ -915,10 +915,12 @@
>>>                len = PES_START_SIZE - pes->data_index;
>>>                if (len>   buf_size)
>>>                    len = buf_size;
>>> -            memcpy(pes->header + pes->data_index, p, len);
>>> -            pes->data_index += len;
>>> -            p += len;
>>> -            buf_size -= len;
>>> +            if (len>   0) {
>>> +                memcpy(pes->header + pes->data_index, p, len);
>>> +                pes->data_index += len;
>>> +                p += len;
>>> +                buf_size -= len;
>>> +            }
>>
>> Well, len<  0 is an error IMHO. I'd like to have a sample though,
>> this should not happen.
>>
>>> [...]
>>>
>>>                if (pes->data_index == PES_START_SIZE) {
>>>                    /* we got all the PES or section header. We can now
>>>                       decide */
>>>
>>>> However, it's IMHO just a workaround and the real root cause of the
>>>> problem
>>>> should be found. At this time, pes->buffer is NULL, but data for PES
>>>> packet
>>>> are coming in =>   crash.
>>>>
>>>> Crashing sample is here:
>>>> http://dennedy.org/~ddennedy/dvgrab-2009.03.28_19-07-22.m2t
>>>> Playable sample is here:
>>>> http://dennedy.org/~ddennedy/dvgrab-2009.03.28_19-06-41.m2t
>>>>
>>>> Both samples seem to be seriously broken at the beginning. They
>>>> originated
>>>> from a HDV-capable camcorder (MPEG-TS containing MPEG-2 video).
>>>
>>> Last night, after some serious testing and soul searching, I
>>> discovered some file system corruption or bad file transfers when
>>> archiving this material to external HDD. There were some HDV test
>>> samples that were failing that I _know_ had worked well in the past. I
>>> had a backup of those on my network, and when I tested them over the
>>> network, they worked fine! An e2fsck on that disk did indeed find some
>>> problems that the "automatic repair" option could not fix.
>>>
>>> So, the samples above are definitely not to be considered playable,
>>> but I can confirm older versions of ffmpeg (0.5) at least did not
>>> segfault on this corrupt input. With these two changes, it is much
>>> more stable.
>>>
>>
>> These 2 files can be played if MAX_RESYNC_SIZE is increased to 65536.
>> Note that mplayer reads them.
>>
>> Is 65k reasonable ?
>
> i didnt follow this thread but if i understand the code correctly then
> UINT64_MAX seems more reasonable to me ;)
> whats the point in not continuing to search for a packet but failing
> fatally, which i think is what the code would do?

Avoiding reading 100MB on a slow link ?
IMHO we need a limit, if you are ok with 65k, then I'll update it.

> a EAGAIN might make sense but a hard error IMHO not ...

Well EAGAIN seems interesting, it would be good to indicate there was an 
error somewhere though...

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



More information about the ffmpeg-devel mailing list