[FFmpeg-devel] [PATCH 05/21] avformat/matroskadec: Set offset of first cluster

Steve Lhomme robux4 at ycbcr.xyz
Sun Apr 7 09:35:41 EEST 2019


On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:
> By default, the data_offset member of the AVFormatInternal of the
> AVFormatContext associated with the MatroskaDemuxContext has not been
> initialized explicitly by any Matroska-specific function, so that it was
> initialized by default to the offset at the end of matroska_read_header,
> i.e. usually to the offset of the length field of the first encountered
> cluster. This meant that in case that the Matroska-specific seek-code
> fails because there are no index entries for the target track a seek to
> data_offset would be performed and ordinary parsing would start from
> there which is nonsense: The length field would be treated as EBML ID and
> (if the length field is not longer than four bytes (EBML numbers that
> long are rejected as invalid EBML IDs)) and whatever comes next would be
> treated as its EBML size although it simply isn't.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at googlemail.com>
> ---
>   libavformat/matroskadec.c | 3 +++
>   1 file changed, 3 insertions(+)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 49f8ff4082..f9811b54a1 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -2651,6 +2651,9 @@ static int matroska_read_header(AVFormatContext *s)
>           pos = avio_tell(matroska->ctx->pb);
>           res = ebml_parse(matroska, matroska_segment, matroska);
>       }
> +    /* Set data_offset as it might be needed later by seek_frame_generic. */
> +    if (matroska->current_id)

I'm surprised this doesn't error out if a (level 1) ID is not found here.

> +        s->internal->data_offset = avio_tell(matroska->ctx->pb) - 4;

The "- 4" is OK as long as level 1 elements are always 4 bytes (which is 
the case). But if matroska_resync() ever exits if it finds an EBML Void 
or CRC-32 then this will break.

The code is safe for now but may not be future proof.

>       matroska_execute_seekhead(matroska);
>   
>       if (!matroska->time_scale)
> -- 
> 2.19.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list