diff mbox

[FFmpeg-devel,08/16] avformat/hlsenc: Add deinit function

Message ID 20191216000418.24707-9-andreas.rheinhardt@gmail.com
State Superseded
Headers show

Commit Message

Andreas Rheinhardt Dec. 16, 2019, 12:04 a.m. UTC
This fixes memleaks in instances such as:
a) When an allocation fails at one of the two places in hls_init() where
the error is returned immediately without goto fail first.
b) When an error happens when writing the header.
c) When an allocation fails at one of the three places in
hls_write_trailer() where the error is returned immediately without goto
fail first.
d) When one decides not to write the trailer at all (e.g. because of
errors when writing packets).
Furthermore, it removes code duplication and allows to return
immediately, without goto fail first.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
Strange that this muxer (with its many allocations) didn't have a deinit
function before.

 libavformat/hlsenc.c | 47 ++++++++++++++++----------------------------
 1 file changed, 17 insertions(+), 30 deletions(-)
diff mbox

Patch

diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 7fcc71264b..8f142fd475 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -2476,8 +2476,9 @@  static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
     return ret;
 }
 
-static void hls_free_variant_streams(struct HLSContext *hls)
+static void hls_deinit(AVFormatContext *s)
 {
+    HLSContext *hls = s->priv_data;
     int i = 0;
     AVFormatContext *vtt_oc = NULL;
     VariantStream *vs = NULL;
@@ -2507,6 +2508,20 @@  static void hls_free_variant_streams(struct HLSContext *hls)
         av_freep(&vs->baseurl);
         av_freep(&vs->varname);
     }
+
+    for (i = 0; i < hls->nb_ccstreams; i++) {
+        ClosedCaptionsStream *ccs = &hls->cc_streams[i];
+        av_freep(&ccs->ccgroup);
+        av_freep(&ccs->instreamid);
+        av_freep(&ccs->language);
+    }
+
+    ff_format_io_close(s, &hls->m3u8_out);
+    ff_format_io_close(s, &hls->sub_m3u8_out);
+    av_freep(&hls->key_basename);
+    av_freep(&hls->var_streams);
+    av_freep(&hls->cc_streams);
+    av_freep(&hls->master_m3u8_url);
 }
 
 static int hls_write_trailer(struct AVFormatContext *s)
@@ -2640,21 +2655,6 @@  failed:
         av_free(old_filename);
     }
 
-    hls_free_variant_streams(hls);
-
-    for (i = 0; i < hls->nb_ccstreams; i++) {
-        ClosedCaptionsStream *ccs = &hls->cc_streams[i];
-        av_freep(&ccs->ccgroup);
-        av_freep(&ccs->instreamid);
-        av_freep(&ccs->language);
-    }
-
-    ff_format_io_close(s, &hls->m3u8_out);
-    ff_format_io_close(s, &hls->sub_m3u8_out);
-    av_freep(&hls->key_basename);
-    av_freep(&hls->var_streams);
-    av_freep(&hls->cc_streams);
-    av_freep(&hls->master_m3u8_url);
     return 0;
 }
 
@@ -2960,20 +2960,6 @@  static int hls_init(AVFormatContext *s)
     }
 
 fail:
-    if (ret < 0) {
-        hls_free_variant_streams(hls);
-        for (i = 0; i < hls->nb_ccstreams; i++) {
-            ClosedCaptionsStream *ccs = &hls->cc_streams[i];
-            av_freep(&ccs->ccgroup);
-            av_freep(&ccs->instreamid);
-            av_freep(&ccs->language);
-        }
-        av_freep(&hls->key_basename);
-        av_freep(&hls->var_streams);
-        av_freep(&hls->cc_streams);
-        av_freep(&hls->master_m3u8_url);
-    }
-
     return ret;
 }
 
@@ -3069,5 +3055,6 @@  AVOutputFormat ff_hls_muxer = {
     .write_header   = hls_write_header,
     .write_packet   = hls_write_packet,
     .write_trailer  = hls_write_trailer,
+    .deinit         = hls_deinit,
     .priv_class     = &hls_class,
 };