diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-09-05 23:36:03 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-09-10 13:44:12 +0200 |
commit | 848f96a2a6f1f60c8e0539a421d08ce8b4f24139 (patch) | |
tree | 8ef3ddcb31416dbafbe79d8b8986b20baa61a023 /libavformat/segment.c | |
parent | 30de02998df3b253dce68904cfdd50cdfe6fb3ed (diff) | |
download | ffmpeg-848f96a2a6f1f60c8e0539a421d08ce8b4f24139.tar.gz |
avformat/segment: Free SegmentListEntries in deinit, not write_trailer
This fixes leaks when the trailer is never written.
Reviewed-by: Ridley Combs <rcombs@rcombs.me>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r-- | libavformat/segment.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c index cf29d336be..3788d9cf90 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -660,6 +660,8 @@ static int select_reference_stream(AVFormatContext *s) static void seg_free(AVFormatContext *s) { SegmentContext *seg = s->priv_data; + SegmentListEntry *cur; + ff_format_io_close(s, &seg->list_pb); if (seg->avf) { if (seg->is_nullctx) @@ -672,6 +674,14 @@ static void seg_free(AVFormatContext *s) av_freep(&seg->times); av_freep(&seg->frames); av_freep(&seg->cur_entry.filename); + + cur = seg->segment_list_entries; + while (cur) { + SegmentListEntry *next = cur->next; + av_freep(&cur->filename); + av_free(cur); + cur = next; + } } static int seg_init(AVFormatContext *s) @@ -971,7 +981,6 @@ static int seg_write_trailer(struct AVFormatContext *s) { SegmentContext *seg = s->priv_data; AVFormatContext *oc = seg->avf; - SegmentListEntry *cur, *next; int ret = 0; if (!oc) @@ -994,14 +1003,6 @@ fail: av_opt_free(seg); - cur = seg->segment_list_entries; - while (cur) { - next = cur->next; - av_freep(&cur->filename); - av_free(cur); - cur = next; - } - avformat_free_context(oc); seg->avf = NULL; return ret; |