avfilter/vf_vpp_qsv: Fix leak of AVFilterFormats on error

The vpp_qsv's query_formats function allocated two AVFilterFormats,
before storing them permanently. If storing the first of them fails,
the function simply returns and the second leaks. This has been fixed by
only allocating the second AVFilterFormats structure after the first one
has been successfully stored.

Fixes Coverity issue #1422231.

Reviewed-by: Nicolas George <george@nsup.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
pull/350/head
Andreas Rheinhardt 4 years ago
parent 6a65449954
commit c4beb0783b
  1. 13
      libavfilter/vf_vpp_qsv.c

@ -489,7 +489,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
static int query_formats(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx)
{ {
int ret; int ret;
AVFilterFormats *in_fmts, *out_fmts;
static const enum AVPixelFormat in_pix_fmts[] = { static const enum AVPixelFormat in_pix_fmts[] = {
AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NV12, AV_PIX_FMT_NV12,
@ -505,16 +504,12 @@ static int query_formats(AVFilterContext *ctx)
AV_PIX_FMT_NONE AV_PIX_FMT_NONE
}; };
in_fmts = ff_make_format_list(in_pix_fmts); ret = ff_formats_ref(ff_make_format_list(in_pix_fmts),
out_fmts = ff_make_format_list(out_pix_fmts); &ctx->inputs[0]->out_formats);
ret = ff_formats_ref(in_fmts, &ctx->inputs[0]->out_formats);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = ff_formats_ref(out_fmts, &ctx->outputs[0]->in_formats); return ff_formats_ref(ff_make_format_list(out_pix_fmts),
if (ret < 0) &ctx->outputs[0]->in_formats);
return ret;
return 0;
} }
static av_cold void vpp_uninit(AVFilterContext *ctx) static av_cold void vpp_uninit(AVFilterContext *ctx)

Loading…
Cancel
Save