[FFmpeg-devel] [PATCH v2 18/21] avfilter/vf_hwdownload: Fix leak of formats list upon error

Nicolas George george at nsup.org
Sat Aug 22 15:22:08 EEST 2020


Andreas Rheinhardt (12020-08-21):
> If adding the list of input formats to its AVFilterLink fails, the list
> of output formats (which has not been attached to permanent storage yet)
> leaks. This has been fixed by not creating the lists of in- and output
> formats simultaneously. Instead creating said lists is relegated to
> ff_formats_pixdesc_filter() (this also avoids the reallocations implicit
> in using ff_add_format()) and the second list is only created after (and
> if) the first list has been permanently attached to ist AVFilterLink.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> ff_formats_pixdesc_filter() uses av_pix_fmt_desc_get() under the hood;
> but both av_pix_fmt_desc_get() and av_pix_fmt_desc_next() lead
> (currently) to the same order of pixel formats (it coincides with the
> natural order) and given that this filter doesn't seem to have any
> preferred order at all, it wouldn't even matter if these two methods
> yielded different results one day.

The order of formats should not matter, the API does not mean them to
matter.

> 
>  libavfilter/vf_hwdownload.c | 23 +++++------------------
>  1 file changed, 5 insertions(+), 18 deletions(-)
> 
> diff --git a/libavfilter/vf_hwdownload.c b/libavfilter/vf_hwdownload.c
> index 33af30cf40..faf2ea8c0e 100644
> --- a/libavfilter/vf_hwdownload.c
> +++ b/libavfilter/vf_hwdownload.c
> @@ -37,26 +37,13 @@ typedef struct HWDownloadContext {
>  
>  static int hwdownload_query_formats(AVFilterContext *avctx)
>  {
> -    AVFilterFormats  *infmts = NULL;
> -    AVFilterFormats *outfmts = NULL;
> -    const AVPixFmtDescriptor *desc;
> +    AVFilterFormats *fmts;
>      int err;
>  
> -    for (desc = av_pix_fmt_desc_next(NULL); desc;
> -         desc = av_pix_fmt_desc_next(desc)) {
> -        if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL)
> -            err = ff_add_format(&infmts,  av_pix_fmt_desc_get_id(desc));
> -        else
> -            err = ff_add_format(&outfmts, av_pix_fmt_desc_get_id(desc));
> -        if (err) {
> -            ff_formats_unref(&infmts);
> -            ff_formats_unref(&outfmts);
> -            return err;
> -        }
> -    }
> -
> -    if ((err = ff_formats_ref(infmts,  &avctx->inputs[0]->out_formats)) < 0 ||
> -        (err = ff_formats_ref(outfmts, &avctx->outputs[0]->in_formats)) < 0)
> +    if ((err = ff_formats_pixdesc_filter(&fmts, AV_PIX_FMT_FLAG_HWACCEL, 0)) ||
> +        (err = ff_formats_ref(fmts, &avctx->inputs[0]->out_formats))         ||
> +        (err = ff_formats_pixdesc_filter(&fmts, 0, AV_PIX_FMT_FLAG_HWACCEL)) ||
> +        (err = ff_formats_ref(fmts, &avctx->outputs[0]->in_formats)))
>          return err;
>  
>      return 0;

It looks ok, but I do not maintain this code.

Regards,

-- 
  Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20200822/e3305470/attachment.sig>


More information about the ffmpeg-devel mailing list