[FFmpeg-devel] [PATCH 6/8] avfilter/show_palette: fix memory leak

Ganesh Ajjanagadde gajjanag at mit.edu
Fri Dec 4 19:51:02 CET 2015


On Fri, Dec 4, 2015 at 11:34 AM, Clément Bœsch <u at pkh.me> wrote:
> On Fri, Dec 04, 2015 at 09:39:41AM -0500, Ganesh Ajjanagadde wrote:
>> Recent commits 6aaac24d72a7da631173209841a3944fcb4a3309 and
>> 3835554bf8ed78539a3492c239f979c0ab03a15f made progress towards cleaning
>> up usage of the formats API, and in particular fixed possible NULL pointer
>> dereferences.
>>
>> This commit addresses the issue of possible resource leaks when some intermediate
>> call fails. Unfortunately, even leaving aside this subtle intermediate
>> failure aspect, commit 8087632027d755cd32ccc9e91ea025e276197055 was only
>> partially successful in addressing memleaks. Hopefully, this commit
>> fixes the issue completely.
>>
>> Tested with valgrind --leak-check=full --show-leak-kinds=all, and manual simulation
>> of malloc/realloc failures.
>>
>> Fixes: CID 1270818.
>>
>> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
>> ---
>>  libavfilter/vf_showpalette.c | 14 ++++++++++----
>>  1 file changed, 10 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavfilter/vf_showpalette.c b/libavfilter/vf_showpalette.c
>> index fcb43a3..1614157 100644
>> --- a/libavfilter/vf_showpalette.c
>> +++ b/libavfilter/vf_showpalette.c
>> @@ -50,14 +50,20 @@ static int query_formats(AVFilterContext *ctx)
>>      AVFilterFormats *in  = ff_make_format_list(in_fmts);
>>      AVFilterFormats *out = ff_make_format_list(out_fmts);
>>      if (!in || !out) {
>> -        av_freep(&in);
>> -        av_freep(&out);
>> -        return AVERROR(ENOMEM);
>> +        ret = AVERROR(ENOMEM);
>> +        goto fail;
>>      }
>> +
>>      if ((ret = ff_formats_ref(in , &ctx->inputs[0]->out_formats)) < 0 ||
>>          (ret = ff_formats_ref(out, &ctx->outputs[0]->in_formats)) < 0)
>> -        return ret;
>> +        goto fail;
>>      return 0;
>> +fail:
>
>> +    av_freep(&in->formats);
>
> what if in==NULL?
>
>> +    av_freep(&in);
>
>> +    av_freep(&out->formats);
>
> ditto
>
>> +    av_freep(&out);
>> +    return ret;
>>  }

Fixed locally with an if(in) and similar checks. Also applies to other
patches I sent.

>
> --
> Clément B.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list