[FFmpeg-cvslog] avutil/dict: fix memleak in av_dict_set()
James Almer
git at videolan.org
Tue Apr 8 05:40:12 EEST 2025
ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Mon Apr 7 19:37:49 2025 -0300| [1e5c65f5392b7d4daca0282840750987fef0a582] | committer: James Almer
avutil/dict: fix memleak in av_dict_set()
Regression since 19e9a203b7b8e613840b055cdf68303a4fb84581.
Signed-off-by: James Almer <jamrial at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1e5c65f5392b7d4daca0282840750987fef0a582
---
libavutil/dict.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/libavutil/dict.c b/libavutil/dict.c
index f7dcd07eeb..fafb454fd3 100644
--- a/libavutil/dict.c
+++ b/libavutil/dict.c
@@ -99,27 +99,28 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value,
err = AVERROR(EINVAL);
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)) {
tag = av_dict_get(m, key, NULL, flags);
} else if (flags & AV_DICT_DEDUP) {
while ((tag = av_dict_get(m, key, tag, flags))) {
if ((!value && !tag->value) ||
(value && tag->value && !strcmp(value, tag->value))) {
- if (flags & AV_DICT_DONT_STRDUP_KEY)
- av_free((void*)key);
- if (flags & AV_DICT_DONT_STRDUP_VAL)
- av_free((void*)value);
+ av_free(copy_key);
+ av_free(copy_value);
return 0;
}
}
}
- if (flags & AV_DICT_DONT_STRDUP_KEY)
- copy_key = (void *)key;
- else
- copy_key = av_strdup(key);
if (!m)
m = *pm = av_mallocz(sizeof(*m));
- if (!m || !copy_key || (value && !copy_value))
+ if (!m)
goto enomem;
if (tag) {
More information about the ffmpeg-cvslog
mailing list