diff mbox series

[FFmpeg-devel,15/17] avformat/webm_chunk: Add deinit function

Message ID 20200302044445.14842-11-andreas.rheinhardt@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel,1/17] avformat: Use correct error in case muxer is not found
Related show

Checks

Context Check Description
andriy/ffmpeg-patchwork pending
andriy/ffmpeg-patchwork success Applied patch
andriy/ffmpeg-patchwork success Configure finished
andriy/ffmpeg-patchwork success Make finished
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Andreas Rheinhardt March 2, 2020, 4:44 a.m. UTC
This fixes memleaks if an error happens after one of the allocations
in init; or if the trailer isn't written (e.g. because there was an
error when writing a packet).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavformat/webm_chunk.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/webm_chunk.c b/libavformat/webm_chunk.c
index efdce62391..6ffe952eff 100644
--- a/libavformat/webm_chunk.c
+++ b/libavformat/webm_chunk.c
@@ -258,13 +258,22 @@  static int webm_chunk_write_trailer(AVFormatContext *s)
     if (!oc->pb) {
         ret = chunk_start(s);
         if (ret < 0)
-            goto fail;
+            return ret;
     }
     av_write_trailer(oc);
-    ret = chunk_end(s, 0);
-fail:
-    avformat_free_context(oc);
-    return ret;
+    return chunk_end(s, 0);
+}
+
+static void webm_chunk_deinit(AVFormatContext *s)
+{
+    WebMChunkContext *wc = s->priv_data;
+
+    if (!wc->avf)
+        return;
+
+    ffio_free_dyn_buf(&wc->avf->pb);
+    avformat_free_context(wc->avf);
+    wc->avf = NULL;
 }
 
 #define OFFSET(x) offsetof(WebMChunkContext, x)
@@ -296,6 +305,7 @@  AVOutputFormat ff_webm_chunk_muxer = {
     .write_header   = webm_chunk_write_header,
     .write_packet   = webm_chunk_write_packet,
     .write_trailer  = webm_chunk_write_trailer,
+    .deinit         = webm_chunk_deinit,
     .priv_class     = &webm_chunk_class,
 };
 #endif