[FFmpeg-devel] [PATCH 07/10] avformat/segment: Free SegmentListEntries in deinit, not write_trailer

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Mon Sep 7 05:49:49 EEST 2020


This fixes leaks when the trailer is never written.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
The allocation of the filename is btw currently unchecked. Actually,
using a flexible array member for it would be advantageous (it could
then be allocated and freed together with its SegmentListEntry).
Flexible array members are C99. Are they allowed or do we support
systems that don't support them?

 libavformat/segment.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/libavformat/segment.c b/libavformat/segment.c
index 55d7f62ca0..d895e6a678 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -661,6 +661,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)
@@ -673,6 +675,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)
@@ -981,7 +991,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)
@@ -1004,14 +1013,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;
-- 
2.20.1



More information about the ffmpeg-devel mailing list