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>
(cherry picked from commit 0841063ce6)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-06-13 23:58:32 +02:00
parent 6f0304b9d9
commit 5084210d8c
1 changed files with 10 additions and 4 deletions

View File

@ -3961,14 +3961,17 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
return -1; return -1;
} }
if (!matroska->tracks.nb_elem || !s->nb_streams) { if (!matroska->tracks.nb_elem || !s->nb_streams) {
matroska_read_close(s);
av_log(s, AV_LOG_ERROR, "No track found\n"); av_log(s, AV_LOG_ERROR, "No track found\n");
return AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
goto fail;
} }
if (!matroska->is_live) { if (!matroska->is_live) {
buf = av_asprintf("%g", matroska->duration); 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, 0); av_dict_set(&s->streams[0]->metadata, DURATION, buf, 0);
av_free(buf); av_free(buf);
@ -3991,7 +3994,7 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
ret = webm_dash_manifest_cues(s, init_range); ret = webm_dash_manifest_cues(s, init_range);
if (ret < 0) { if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Error parsing Cues\n"); av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
return ret; goto fail;
} }
} }
@ -4001,6 +4004,9 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
matroska->bandwidth, 0); matroska->bandwidth, 0);
} }
return 0; return 0;
fail:
matroska_read_close(s);
return ret;
} }
static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt) static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)