summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-08-07 23:40:43 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-08-24 01:00:56 +0200
commit257cd5fa389465032b2b222fff5ada9dfebeb4d0 (patch)
treec2d4b0f8afbcbe5b856b02550ef166fb3d1d300e
parent2a471af50aab02e8bb062c84a5779c7de1952fc0 (diff)
avfilter/vf_hwdownload: Fix leak of formats list upon error
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 its AVFilterLink. Reviewed-by: Nicolas George <george@nsup.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r--libavfilter/vf_hwdownload.c23
1 files 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;