]> git.sesse.net Git - ffmpeg/commitdiff
avformat/matroskadec: Fix memleaks in WebM DASH manifest demuxer
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Sat, 13 Jun 2020 21:58:32 +0000 (23:58 +0200)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Mon, 15 Jun 2020 14:35:28 +0000 (16:35 +0200)
In certain error scenarios, the underlying Matroska demuxer was not
properly closed, causing leaks.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavformat/matroskadec.c

index 2f71ae2a65d70615d69f1cb8816a289be4c78770..cff7f0cb54ab6bfab6ec53fab6843b38f09fdec3 100644 (file)
@@ -4181,14 +4181,17 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
         return -1;
     }
     if (!matroska->tracks.nb_elem || !s->nb_streams) {
-        matroska_read_close(s);
         av_log(s, AV_LOG_ERROR, "No track found\n");
-        return AVERROR_INVALIDDATA;
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
     }
 
     if (!matroska->is_live) {
         buf = av_asprintf("%g", matroska->duration);
-        if (!buf) return AVERROR(ENOMEM);
+        if (!buf) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
         av_dict_set(&s->streams[0]->metadata, DURATION,
                     buf, AV_DICT_DONT_STRDUP_VAL);
 
@@ -4211,7 +4214,7 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
         ret = webm_dash_manifest_cues(s, init_range);
         if (ret < 0) {
             av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
-            return ret;
+            goto fail;
         }
     }
 
@@ -4221,6 +4224,9 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
                         matroska->bandwidth, 0);
     }
     return 0;
+fail:
+    matroska_read_close(s);
+    return ret;
 }
 
 static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)