diff mbox series

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

Message ID 20200907024952.11697-7-andreas.rheinhardt@gmail.com
State Accepted
Commit 848f96a2a6f1f60c8e0539a421d08ce8b4f24139
Headers show
Series [FFmpeg-devel,01/10] avformat/segment: Don't overwrite AVCodecParameters after init | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Andreas Rheinhardt Sept. 7, 2020, 2:49 a.m. UTC
This fixes leaks when the trailer is never written.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@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 mbox series

Patch

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;