summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-08-07 23:40:43 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2021-02-27 07:20:57 +0100
commit1f0bfdffe3797deb23ebc5ec9aea8b5dbc2f454b (patch)
tree6c29b71de04010194bcd07433813cb18ea39d963 /libavfilter
parent4516fc3e2b94c77b58749b22d7f1151ffb9e2114 (diff)
downloadffmpeg-1f0bfdffe3797deb23ebc5ec9aea8b5dbc2f454b.tar.gz
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> (cherry picked from commit 257cd5fa389465032b2b222fff5ada9dfebeb4d0)
Diffstat (limited to 'libavfilter')
-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;