From 8fc9bd0d32f0ef806adddfb7dfc56c538c85f4d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Tue, 29 Jul 2014 21:16:35 +0200 Subject: [PATCH] dict.c: Free non-strduped av_dict_set arguments on error. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unfortunately this was not explicitly documented and thus might be risky. But all uses I could find in FFmpeg and one in VLC had a memleak in these cases, and I could not find any that relied on the previous behaviour. Signed-off-by: Reimar Döffinger --- doc/APIchanges | 5 +++++ libavutil/dict.c | 2 ++ libavutil/dict.h | 5 +++++ libavutil/version.h | 2 +- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 2657470b6d..5dde605fd0 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,11 @@ libavutil: 2014-08-09 API changes, most recent first: +2014-08-23 - xxxxxxx - lavu 54.7.100 - dict.h + AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL arguments are now + freed even on error. This is consistent with the behaviour all users + of it we could find expect. + 2014-08-21 - 980a5b0 - lavu 54.6.100 - frame.h motion_vector.h Add AV_FRAME_DATA_MOTION_VECTORS side data and AVMotionVector structure diff --git a/libavutil/dict.c b/libavutil/dict.c index c17ce7a3cb..bdb56908d3 100644 --- a/libavutil/dict.c +++ b/libavutil/dict.c @@ -126,6 +126,8 @@ err_out: av_free(m->elems); av_freep(pm); } + if (flags & AV_DICT_DONT_STRDUP_KEY) av_free(key); + if (flags & AV_DICT_DONT_STRDUP_VAL) av_free(value); return AVERROR(ENOMEM); } diff --git a/libavutil/dict.h b/libavutil/dict.h index 06f1621d45..9b3381b828 100644 --- a/libavutil/dict.h +++ b/libavutil/dict.h @@ -115,6 +115,9 @@ int av_dict_count(const AVDictionary *m); /** * Set the given entry in *pm, overwriting an existing entry. * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL * a dictionary struct is allocated and put in *pm. * @param key entry key to add to *pm (will be av_strduped depending on flags) @@ -127,6 +130,8 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags /** * Convenience wrapper for av_dict_set that converts the value to a string * and stores it. + * + * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. */ int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); diff --git a/libavutil/version.h b/libavutil/version.h index 4236ed24fd..8311cddce0 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -56,7 +56,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 54 -#define LIBAVUTIL_VERSION_MINOR 6 +#define LIBAVUTIL_VERSION_MINOR 7 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \