On Tue, Dec 16, 2014 at 1:21 PM, Luca Barbato <[email protected]> wrote:
> ---
>
> It does not free the dictionary if it wasn't just allocated.
>
>
>  libavutil/dict.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/libavutil/dict.c b/libavutil/dict.c
> index e4ea776..7f48320 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)
> --
> 2.1.0

This looks good to me.
-- 
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to