On 12/10/15, Ganesh Ajjanagadde <gajja...@mit.edu> wrote: > On Wed, Dec 9, 2015 at 6:09 PM, Paul B Mahol <one...@gmail.com> wrote: >> On 12/9/15, Ganesh Ajjanagadde <gajjanaga...@gmail.com> wrote: >>> On Fri, Dec 4, 2015 at 9:39 AM, Ganesh Ajjanagadde >>> <gajjanaga...@gmail.com> 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. >>>> >>>> Tested with valgrind --leak-check=full --show-leak-kinds=all, and manual >>>> simulation >>>> of malloc/realloc failures. >>>> >>>> Fixes: CID 1338327. >>>> >>>> Signed-off-by: Ganesh Ajjanagadde <gajjanaga...@gmail.com> >>>> --- >>>> libavfilter/vf_overlay.c | 32 +++++++++++++++++++++++--------- >>>> 1 file changed, 23 insertions(+), 9 deletions(-) >>>> >>>> diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c >>>> index 3c61731..68cfb1b 100644 >>>> --- a/libavfilter/vf_overlay.c >>>> +++ b/libavfilter/vf_overlay.c >>>> @@ -252,23 +252,31 @@ static int query_formats(AVFilterContext *ctx) >>>> switch (s->format) { >>>> case OVERLAY_FORMAT_YUV420: >>>> if (!(main_formats = >>>> ff_make_format_list(main_pix_fmts_yuv420)) || >>>> - !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_yuv420))) >>>> - return AVERROR(ENOMEM); >>>> + !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_yuv420))) { >>>> + ret = AVERROR(ENOMEM); >>>> + goto fail; >>>> + } >>>> break; >>>> case OVERLAY_FORMAT_YUV422: >>>> if (!(main_formats = >>>> ff_make_format_list(main_pix_fmts_yuv422)) || >>>> - !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_yuv422))) >>>> - return AVERROR(ENOMEM); >>>> + !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_yuv422))) { >>>> + ret = AVERROR(ENOMEM); >>>> + goto fail; >>>> + } >>>> break; >>>> case OVERLAY_FORMAT_YUV444: >>>> if (!(main_formats = >>>> ff_make_format_list(main_pix_fmts_yuv444)) || >>>> - !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_yuv444))) >>>> - return AVERROR(ENOMEM); >>>> + !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_yuv444))) { >>>> + ret = AVERROR(ENOMEM); >>>> + goto fail; >>>> + } >>>> break; >>>> case OVERLAY_FORMAT_RGB: >>>> if (!(main_formats = ff_make_format_list(main_pix_fmts_rgb)) >>>> || >>>> - !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_rgb))) >>>> - return AVERROR(ENOMEM); >>>> + !(overlay_formats = >>>> ff_make_format_list(overlay_pix_fmts_rgb))) { >>>> + ret = AVERROR(ENOMEM); >>>> + goto fail; >>>> + } >>>> break; >>>> default: >>>> av_assert0(0); >>>> @@ -277,9 +285,15 @@ static int query_formats(AVFilterContext *ctx) >>>> if ((ret = ff_formats_ref(main_formats , >>>> &ctx->inputs[MAIN]->out_formats )) < 0 || >>>> (ret = ff_formats_ref(overlay_formats, >>>> &ctx->inputs[OVERLAY]->out_formats)) < 0 || >>>> (ret = ff_formats_ref(main_formats , >>>> &ctx->outputs[MAIN]->in_formats )) < 0) >>>> - return ret; >>>> + goto fail; >>>> >>>> return 0; >>>> +fail: >>>> + av_freep(&main_formats->formats); >>>> + av_freep(&main_formats); >>>> + av_freep(&overlay_formats->formats); >>>> + av_freep(&overlay_formats); >>>> + return ret; >>>> } >>>> >>>> static const enum AVPixelFormat alpha_pix_fmts[] = { >>>> -- >>>> 2.6.3 >>>> >>> >>> pushed, with the necessary modification described by Clement >> >> This tries to dereference uninitialized value. > > See right above; I did the desired modification and believe there is no > issue. > I might be wrong; but if so, could you please refer to the relevant > cvslog message? > Thanks.
libavfilter/vf_overlay.c:275:13: warning: variable 'overlay_formats' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized] if (!(main_formats = ff_make_format_list(main_pix_fmts_rgb)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:295:9: note: uninitialized use occurs here if (overlay_formats) ^~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:275:13: note: remove the '||' if its condition is always false if (!(main_formats = ff_make_format_list(main_pix_fmts_rgb)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:268:13: warning: variable 'overlay_formats' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized] if (!(main_formats = ff_make_format_list(main_pix_fmts_yuv444)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:295:9: note: uninitialized use occurs here if (overlay_formats) ^~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:268:13: note: remove the '||' if its condition is always false if (!(main_formats = ff_make_format_list(main_pix_fmts_yuv444)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:261:13: warning: variable 'overlay_formats' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized] if (!(main_formats = ff_make_format_list(main_pix_fmts_yuv422)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:295:9: note: uninitialized use occurs here if (overlay_formats) ^~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:261:13: note: remove the '||' if its condition is always false if (!(main_formats = ff_make_format_list(main_pix_fmts_yuv422)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:254:13: warning: variable 'overlay_formats' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized] if (!(main_formats = ff_make_format_list(main_pix_fmts_yuv420)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:295:9: note: uninitialized use occurs here if (overlay_formats) ^~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:254:13: note: remove the '||' if its condition is always false if (!(main_formats = ff_make_format_list(main_pix_fmts_yuv420)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libavfilter/vf_overlay.c:249:37: note: initialize the variable 'overlay_formats' to silence this warning AVFilterFormats *overlay_formats; ^ = NULL 4 warnings generated. > >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel