[FFmpeg-devel] [PATCH 1/3] avformat/matroskadec: Sanitize SeekHead entries
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Thu May 7 07:58:40 EEST 2020
Andreas Rheinhardt:
> A Seek element in a Matroska SeekHead should contain a SeekID and a
> SeekPosition element and upon reading, they should be sanitized:
>
> Given that IDs are restricted to 32 bit, longer SeekIDs should be treated
> as invalid. Instead currently the lower 32 bits have been used.
>
> For SeekPosition, no checks were performed for the element to be
> present and if present, whether it was excessively large (i.e. the
> absolute file position described by it exceeding INT64_MAX). The
> SeekPosition element had a default value of -1 which means that a check
> seems to have been intended; but it was not implemented. This commit adds
> a check for overflow to the calculation of the absolute file position of
> the referenced level 1 elements.
> Using -1 (i.e. UINT64_MAX) as default value for SeekPosition implies that
> a Seek element without SeekPosition will run afoul of this check.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> libavformat/matroskadec.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 8e1326abf6..dea8f14f9e 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -1865,8 +1865,12 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
> MatroskaSeekhead *seekheads = seekhead_list->elem;
> uint32_t id = seekheads[i].id;
> int64_t pos = seekheads[i].pos + matroska->segment_start;
> + MatroskaLevel1Element *elem;
>
> - MatroskaLevel1Element *elem = matroska_find_level1_elem(matroska, id);
> + if (id != seekheads[i].id || pos < matroska->segment_start)
> + continue;
> +
> + elem = matroska_find_level1_elem(matroska, id);
> if (!elem || elem->parsed)
> continue;
>
Will apply this patchset tomorrow if there are no objections.
- Andreas
More information about the ffmpeg-devel
mailing list