[FFmpeg-devel] [PATCH] avformat/movenc: Fix stack overflow when remuxing timecode tracks
Martin Storsjö
martin at martin.st
Thu Oct 1 12:56:38 EEST 2020
On Wed, 30 Sep 2020, Andreas Rheinhardt wrote:
> There are two possible kinds of timecode tracks (with tag "tmcd") in the
> mov muxer: Tracks created internally by the muxer and timecode tracks
> sent by the user. If any of the latter exists, the former are
> deactivated. The former all belong to another track, the source
> track; the latter don't have a source track set, but the index of the
> source track is initially zeroed by av_mallocz_array().
Would it be worthwhile to explicitly initialize these to e.g. -1, to make
src_track clearer?
> This is a problem since 3d894db700cc1e360a7a75ab9ac8bf67ac6670a3: Said
> commit added a function that calculates the duration of tracks and the
> duration of timecode tracks is calculated by rescaling the duration
> (calculated by the very same function) of the source track. This gives
> an infinite recursion if the first track (the one that will be treated
> as source track for all timecode tracks) is a timecode track itself,
> leading to a stack overflow.
>
> This commit fixes this by not using the nonexistent source track
> when calculating the duration of timecode tracks not created internally
> by the mov muxer.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> 1. Remuxing timecode tracks is currently impossible for mp4 (the codec
> tag validation fails); I wonder whether this is actually intended given
> that there is a warning that timecode metadata is ignored if an explicit
> timecode track is present.
> 2. There is another place where the src_track field is used even when a
> timecode track doesn't have a src_track: When writing the moov tag
> (lines 4156-4166). This will probably also need to be fixed, but it is
> not dangerous.
> 3. There is btw no validation that a track with "tmcd" tag is a data
> stream.
>
> libavformat/movenc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 2006fcee4b..265465f97b 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -2901,7 +2901,7 @@ static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext
>
> static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track)
> {
> - if (track->tag == MKTAG('t','m','c','d')) {
> + if (track->tag == MKTAG('t','m','c','d') && mov->nb_meta_tmcd) {
> // tmcd tracks gets track_duration set in mov_write_moov_tag from
> // another track's duration, while the end_pts may be left at zero.
This fix in itself is probably good and safe, so LGTM.
// Martin
More information about the ffmpeg-devel
mailing list