[FFmpeg-devel] [PATCH 1/3] avformat/matroskadec: Reset state also on failure in matroska_reset_status()

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Mon Sep 13 23:57:41 EEST 2021


Michael Niedermayer:
> On Mon, Jul 19, 2021 at 11:12:11PM +0200, Andreas Rheinhardt wrote:
>> Michael Niedermayer:
>>> On Fri, Jul 02, 2021 at 06:17:58PM +0200, Andreas Rheinhardt wrote:
>>>> Michael Niedermayer:
>>>>> The calling code does not handle failures and will fail with assertion failures later.
>>>>> Seeking can always fail even when the position was previously read.
>>>>>
>>>>> Fixes: Assertion failure
>>>>> Fixes: 35253/clusterfuzz-testcase-minimized-ffmpeg_dem_MATROSKA_fuzzer-4693059982983168
>>>>>
>>>>> Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
>>>>> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
>>>>> ---
>>>>>  libavformat/matroskadec.c | 19 ++++++++++++-------
>>>>>  1 file changed, 12 insertions(+), 7 deletions(-)
>>>>>
>>>>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>>>>> index 356a02339c..a0e6e0cf8b 100644
>>>>> --- a/libavformat/matroskadec.c
>>>>> +++ b/libavformat/matroskadec.c
>>>>> @@ -804,20 +804,22 @@ static int matroska_read_close(AVFormatContext *s);
>>>>>  static int matroska_reset_status(MatroskaDemuxContext *matroska,
>>>>>                                   uint32_t id, int64_t position)
>>>>>  {
>>>>> +    int64_t err = 0;
>>>>>      if (position >= 0) {
>>>>> -        int64_t err = avio_seek(matroska->ctx->pb, position, SEEK_SET);
>>>>> -        if (err < 0)
>>>>> -            return err;
>>>>> -    }
>>>>> +        err = avio_seek(matroska->ctx->pb, position, SEEK_SET);
>>>>> +        if (err > 0)
>>>>> +            err = 0;
>>>>> +    } else
>>>>> +        position = avio_tell(matroska->ctx->pb);
>>>>>  
>>>>>      matroska->current_id    = id;
>>>>>      matroska->num_levels    = 1;
>>>>>      matroska->unknown_count = 0;
>>>>> -    matroska->resync_pos = avio_tell(matroska->ctx->pb);
>>>>> +    matroska->resync_pos    = position;
>>>>>      if (id)
>>>>>          matroska->resync_pos -= (av_log2(id) + 7) / 8;
>>>>>  
>>>>> -    return 0;
>>>>> +    return err;
>>>>
>>>> The changes here will make the demuxer update its internal state as if
>>>> it had seeked to its target level-1-element, even though it didn't. Is
>>>> this really good?
>>>
>>> I dont know.
>>> Ive not seen this issue happen in reality just in a fuzzer
>>> environment.
>>>
>>
>> Can you send me this sample (with instructions how to reproduce it if
>> necessary)?
> 
> This seems still "crashing" according to the tracker
> has this been fixed ?
> 

No, I have not found time to look at it. Proceed as you wish.

- Andreas


More information about the ffmpeg-devel mailing list