summaryrefslogtreecommitdiff
path: root/libavformat/hlsenc.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-12-16 01:04:13 +0100
committerSteven Liu <lq@chinaffmpeg.org>2019-12-23 14:05:51 +0800
commit5ba3a8958c76d5490bcc9ba4441f03bedd9aebc6 (patch)
tree193bc117f87f5a92832c07f4a42c54f4342d2b49 /libavformat/hlsenc.c
parent53c1458bf2e91b2279985e5fc2ffaa5e2013564a (diff)
avformat/hlsenc: Fix memleaks with repeating parameters
When a parameter like e.g. language is contained more than once in the part of var_stream_map pertaining to a single VariantStream, the later one just overwrites the pointer to the earlier one, leading to a memleak. This commit changes this by handling the situation gracefully: The earlier string is silently freed first, so that the last one wins. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>
Diffstat (limited to 'libavformat/hlsenc.c')
-rw-r--r--libavformat/hlsenc.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index f3e89a033f..20aa1683da 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -1937,6 +1937,7 @@ static int parse_variant_stream_mapstring(AVFormatContext *s)
while (keyval = av_strtok(varstr, ",", &saveptr2)) {
varstr = NULL;
if (av_strstart(keyval, "language:", &val)) {
+ av_free(vs->language);
vs->language = av_strdup(val);
if (!vs->language)
return AVERROR(ENOMEM);
@@ -1947,16 +1948,19 @@ static int parse_variant_stream_mapstring(AVFormatContext *s)
hls->has_default_key = 1;
continue;
} else if (av_strstart(keyval, "name:", &val)) {
+ av_free(vs->varname);
vs->varname = av_strdup(val);
if (!vs->varname)
return AVERROR(ENOMEM);
continue;
} else if (av_strstart(keyval, "agroup:", &val)) {
+ av_free(vs->agroup);
vs->agroup = av_strdup(val);
if (!vs->agroup)
return AVERROR(ENOMEM);
continue;
} else if (av_strstart(keyval, "ccgroup:", &val)) {
+ av_free(vs->ccgroup);
vs->ccgroup = av_strdup(val);
if (!vs->ccgroup)
return AVERROR(ENOMEM);
@@ -2048,14 +2052,17 @@ static int parse_cc_stream_mapstring(AVFormatContext *s)
ccstr = NULL;
if (av_strstart(keyval, "ccgroup:", &val)) {
+ av_free(ccs->ccgroup);
ccs->ccgroup = av_strdup(val);
if (!ccs->ccgroup)
return AVERROR(ENOMEM);
} else if (av_strstart(keyval, "instreamid:", &val)) {
+ av_free(ccs->instreamid);
ccs->instreamid = av_strdup(val);
if (!ccs->instreamid)
return AVERROR(ENOMEM);
} else if (av_strstart(keyval, "language:", &val)) {
+ av_free(ccs->language);
ccs->language = av_strdup(val);
if (!ccs->language)
return AVERROR(ENOMEM);