You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
avutil/dict: fix memleak in av_dict_set()
Regression since 19e9a203b7
.
Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
@ -99,27 +99,28 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value,
|
|||||||
err = AVERROR(EINVAL);
|
err = AVERROR(EINVAL);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
if (flags & AV_DICT_DONT_STRDUP_KEY)
|
||||||
|
copy_key = (void *)key;
|
||||||
|
else
|
||||||
|
copy_key = av_strdup(key);
|
||||||
|
if (!copy_key || (value && !copy_value))
|
||||||
|
goto enomem;
|
||||||
|
|
||||||
if (!(flags & AV_DICT_MULTIKEY)) {
|
if (!(flags & AV_DICT_MULTIKEY)) {
|
||||||
tag = av_dict_get(m, key, NULL, flags);
|
tag = av_dict_get(m, key, NULL, flags);
|
||||||
} else if (flags & AV_DICT_DEDUP) {
|
} else if (flags & AV_DICT_DEDUP) {
|
||||||
while ((tag = av_dict_get(m, key, tag, flags))) {
|
while ((tag = av_dict_get(m, key, tag, flags))) {
|
||||||
if ((!value && !tag->value) ||
|
if ((!value && !tag->value) ||
|
||||||
(value && tag->value && !strcmp(value, tag->value))) {
|
(value && tag->value && !strcmp(value, tag->value))) {
|
||||||
if (flags & AV_DICT_DONT_STRDUP_KEY)
|
av_free(copy_key);
|
||||||
av_free((void*)key);
|
av_free(copy_value);
|
||||||
if (flags & AV_DICT_DONT_STRDUP_VAL)
|
|
||||||
av_free((void*)value);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (flags & AV_DICT_DONT_STRDUP_KEY)
|
|
||||||
copy_key = (void *)key;
|
|
||||||
else
|
|
||||||
copy_key = av_strdup(key);
|
|
||||||
if (!m)
|
if (!m)
|
||||||
m = *pm = av_mallocz(sizeof(*m));
|
m = *pm = av_mallocz(sizeof(*m));
|
||||||
if (!m || !copy_key || (value && !copy_value))
|
if (!m)
|
||||||
goto enomem;
|
goto enomem;
|
||||||
|
|
||||||
if (tag) {
|
if (tag) {
|
||||||
|
Reference in New Issue
Block a user