]> git.sesse.net Git - ffmpeg/commitdiff
avformat/segment: Fix leak of duration/framenumber lists upon error
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Sat, 5 Sep 2020 17:36:31 +0000 (19:36 +0200)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Thu, 10 Sep 2020 11:24:58 +0000 (13:24 +0200)
The code to free them is not in the segment muxer's deinit function,
but in its write_trailer function which means that these lists leak if
write_trailer isn't called after their allocation. This happens e.g. if
the given lists are invalid (e.g. consisting only of ',' (which delimit
entries)), so that parsing them fails and so does the muxer's init
function; write_trailer is then never called.

This has been fixed by moving the code to free them to the deinit
function.

Reviewed-by: Ridley Combs <rcombs@rcombs.me>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavformat/segment.c

index 0c9b93725d88bc7d3dea08a055a51b5077eef716..0c96c8c50cbc4b8532df0be1e8dfc2f506b25d1a 100644 (file)
@@ -663,6 +663,8 @@ static void seg_free(AVFormatContext *s)
     ff_format_io_close(seg->avf, &seg->list_pb);
     avformat_free_context(seg->avf);
     seg->avf = NULL;
+    av_freep(&seg->times);
+    av_freep(&seg->frames);
 }
 
 static int seg_init(AVFormatContext *s)
@@ -991,8 +993,6 @@ fail:
         ff_format_io_close(s, &seg->list_pb);
 
     av_opt_free(seg);
-    av_freep(&seg->times);
-    av_freep(&seg->frames);
     av_freep(&seg->cur_entry.filename);
 
     cur = seg->segment_list_entries;