diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-06-13 23:58:32 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-06-15 16:35:28 +0200 |
commit | 0841063ce6a2e664fb3986b0a255c57392cd9f02 (patch) | |
tree | bf4f32ea1f7c149e007a82cbd76359c9b16f869d /libavformat | |
parent | 1ef30571a0a7150cb20c580bfc52af2a7101c20d (diff) | |
download | ffmpeg-0841063ce6a2e664fb3986b0a255c57392cd9f02.tar.gz |
avformat/matroskadec: Fix memleaks in WebM DASH manifest demuxer
In certain error scenarios, the underlying Matroska demuxer was not
properly closed, causing leaks.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/matroskadec.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 2f71ae2a65..cff7f0cb54 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -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) |