diff --git a/libavutil/dict.c b/libavutil/dict.c index e4ea7769e0..7f4832092a 100644 --- a/libavutil/dict.c +++ b/libavutil/dict.c @@ -71,9 +71,12 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, AVDictionary *m = *pm; AVDictionaryEntry *tag = av_dict_get(m, key, NULL, flags); char *oldval = NULL; + int allocated = !!m; if (!m) m = *pm = av_mallocz(sizeof(*m)); + if (!m) + return AVERROR(ENOMEM); if (tag) { if (flags & AV_DICT_DONT_OVERWRITE) { @@ -88,12 +91,14 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, av_free(tag->key); *tag = m->elems[--m->count]; } else { - AVDictionaryEntry *tmp = av_realloc(m->elems, - (m->count + 1) * sizeof(*m->elems)); - if (tmp) - m->elems = tmp; - else - return AVERROR(ENOMEM); + int ret = av_reallocp_array(&m->elems, + m->count + 1, sizeof(*m->elems)); + if (ret < 0) { + if (allocated) + av_freep(pm); + + return ret; + } } if (value) { if (flags & AV_DICT_DONT_STRDUP_KEY)