From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 2C5614115B for ; Wed, 14 Sep 2022 12:31:30 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 50E1968BAF2; Wed, 14 Sep 2022 15:31:28 +0300 (EEST) Received: from mail-yw1-f177.google.com (mail-yw1-f177.google.com [209.85.128.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 58DF968B9FD for ; Wed, 14 Sep 2022 15:31:22 +0300 (EEST) Received: by mail-yw1-f177.google.com with SMTP id 00721157ae682-3452214cec6so178137077b3.1 for ; Wed, 14 Sep 2022 05:31:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:references:in-reply-to :mime-version:from:to:cc:subject:date; bh=eecDLP6fWyg84SH+wDFZLW4nQIs+J8C9vGD9aRWt9Os=; b=qSVdjeG+z5lNZiji/nTNQQoaClIb++bs4sm3Rw5rIgMJore7SoVxeW8lYwLZEkREwt hcWAELwA3q27YL0sCVTxwxcbWy1o+1Cg6bn7NQ+u3AMLc1MtjaqnzXwdEaRxpZEDikgn e2mknD3M3xW2eQ/QuNUn4dwsQ2QmEkAry441sxFHtEvSulYZTc8XHv1+fTVWFwzOadL+ ZI+7oQUOlz8Mmj2eUg97te0C9+4Cfr8N/PkgkbLzeb2P0imKWOVcDMfuj3JGzO4JcdJP RIYeyMYlfQW8GOlpRJ/bZUq9382oj80f5ZVVQVCC98pqifuCb1fizTdsuE1f4jkx9FfG QCWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:references:in-reply-to :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=eecDLP6fWyg84SH+wDFZLW4nQIs+J8C9vGD9aRWt9Os=; b=8CElW2tzOM09dMh5jqNjJq2oVjSKqRkRhjQt2Ckaha6CWKE5ihD2vwc8OHzV8LHt/4 I0Ja7p6tzpLZp1LcLCf8i/FLo2yRx04+bdkP4SOlTCa1UlCBQHkpgHwVfeYHL/8IdxsO 2d560kxdo0/udvKyG73iKDZbS/KbHEYTlc2v08XBlsv1ZYHuSxH2WNLXYoUO/48nNH77 BLD0r4+dA5Qk1RfM0YJkTEsw+rHQvUmrBw6aSFdsQXqsiwkmbo9XFWhGjX/9uXqSJjD8 wF1z6E4xe3LaxuoETT/BCBz7H01vMYXkut/jMdOo3UJFyFUHdo4O/ainUJAMKslccknV 8yIw== X-Gm-Message-State: ACgBeo3/G9jZUIJ+bgWFYQoHOn8CY4SANHL7kXejfqptMCNEo9C6+RkM 7qWmhl4yHvk59D54CWPMnpVmsmqrX/lLMgVMHeyW2gT8 X-Google-Smtp-Source: AA6agR6IHzy2mrlzvFepcwhVn6uu1w4qnV9Rbs+qO6bLbXuhHXyE+pEDVa9fouKZMhrjG9atwjHIFVFd+fTPCdCzOdw= X-Received: by 2002:a0d:ccc7:0:b0:345:5848:5feb with SMTP id o190-20020a0dccc7000000b0034558485febmr29294178ywd.302.1663158680703; Wed, 14 Sep 2022 05:31:20 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a81:7402:0:0:0:0:0 with HTTP; Wed, 14 Sep 2022 05:31:20 -0700 (PDT) In-Reply-To: References: From: Paul B Mahol Date: Wed, 14 Sep 2022 14:31:20 +0200 Message-ID: To: FFmpeg development discussions and patches Subject: Re: [FFmpeg-devel] [PATCH 1/3] avutil/dict: Fix memleak when using AV_DICT_APPEND X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andreas Rheinhardt Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 9/13/22, Andreas Rheinhardt wrote: > If a key already exists in an AVDictionary and the AV_DICT_APPEND flag > is set, the old entry is at first discarded from the dictionary, but > a pointer to the value is kept. Lateron enough memory to store the > appended string is allocated; should this allocation fail, the old string > is not freed and hence leaks. This commit changes this by moving > creating the combined value to an earlier point in the function, > which also ensures that the AVDictionaty is unchanged in case of errors. > > Signed-off-by: Andreas Rheinhardt > --- > This is an improved version of > https://patchwork.ffmpeg.org/project/ffmpeg/patch/20191111011259.27313-1-andreas.rheinhardt@gmail.com/ > > libavutil/dict.c | 28 ++++++++++++---------------- > 1 file changed, 12 insertions(+), 16 deletions(-) > > diff --git a/libavutil/dict.c b/libavutil/dict.c > index a4f638a1fc..c01165634e 100644 > --- a/libavutil/dict.c > +++ b/libavutil/dict.c > @@ -73,7 +73,7 @@ int av_dict_set(AVDictionary **pm, const char *key, const > char *value, > { > AVDictionary *m = *pm; > AVDictionaryEntry *tag = NULL; > - char *oldval = NULL, *copy_key = NULL, *copy_value = NULL; > + char *copy_key = NULL, *copy_value = NULL; > > if (!(flags & AV_DICT_MULTIKEY)) { > tag = av_dict_get(m, key, NULL, flags); > @@ -97,10 +97,17 @@ int av_dict_set(AVDictionary **pm, const char *key, > const char *value, > av_free(copy_value); > return 0; > } > - if (flags & AV_DICT_APPEND) > - oldval = tag->value; > - else > - av_free(tag->value); > + if (copy_value && flags & AV_DICT_APPEND) { > + size_t len = strlen(tag->value) + strlen(copy_value) + 1; > + char *newval = av_mallocz(len); > + if (!newval) > + goto err_out; > + av_strlcat(newval, tag->value, len); > + av_strlcat(newval, copy_value, len); > + av_freep(©_value); > + copy_value = newval; > + } > + av_free(tag->value); > av_free(tag->key); > *tag = m->elems[--m->count]; > } else if (copy_value) { > @@ -113,17 +120,6 @@ int av_dict_set(AVDictionary **pm, const char *key, > const char *value, > if (copy_value) { > m->elems[m->count].key = copy_key; > m->elems[m->count].value = copy_value; > - if (oldval && flags & AV_DICT_APPEND) { > - size_t len = strlen(oldval) + strlen(copy_value) + 1; > - char *newval = av_mallocz(len); > - if (!newval) > - goto err_out; > - av_strlcat(newval, oldval, len); > - av_freep(&oldval); > - av_strlcat(newval, copy_value, len); > - m->elems[m->count].value = newval; > - av_freep(©_value); > - } > m->count++; > } else { > av_freep(©_key); > -- > 2.34.1 > LGTM > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".