diff options
author | Clément Bœsch <u@pkh.me> | 2015-03-14 21:21:49 +0100 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2015-03-16 23:43:12 +0100 |
commit | f861d9b2c64752b134d49cb9e790b77221c381c1 (patch) | |
tree | c6f43bc92e459df9698976679525333a5f1a6a84 | |
parent | 93d9ce7cec48a4c6478bba4383613fca3f28740a (diff) | |
download | ffmpeg-f861d9b2c64752b134d49cb9e790b77221c381c1.tar.gz |
avfilter/formats: proper error handling in ff_channel_layouts_ref() and ff_formats_ref()
Also make sure the allocation and its check are properly done.
-rw-r--r-- | libavfilter/formats.c | 22 | ||||
-rw-r--r-- | libavfilter/formats.h | 6 |
2 files changed, 14 insertions, 14 deletions
diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 896ceeba88..6393416cb7 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -400,21 +400,21 @@ AVFilterChannelLayouts *ff_all_channel_counts(void) return ret; } -#define FORMATS_REF(f, ref) \ -do { \ - *ref = f; \ - f->refs = av_realloc(f->refs, sizeof(*f->refs) * ++f->refcount); \ - if (!f->refs) \ - return; \ - f->refs[f->refcount-1] = ref; \ -} while (0) - -void ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref) +#define FORMATS_REF(f, ref) \ + void *tmp = av_realloc_array(f->refs, sizeof(*f->refs), f->refcount + 1); \ + if (!tmp) \ + return AVERROR(ENOMEM); \ + f->refs = tmp; \ + f->refs[f->refcount++] = ref; \ + *ref = f; \ + return 0 + +int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref) { FORMATS_REF(f, ref); } -void ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref) +int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref) { FORMATS_REF(f, ref); } diff --git a/libavfilter/formats.h b/libavfilter/formats.h index 468eac86de..f94855dbe9 100644 --- a/libavfilter/formats.h +++ b/libavfilter/formats.h @@ -159,8 +159,8 @@ int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout); /** * Add *ref as a new reference to f. */ -void ff_channel_layouts_ref(AVFilterChannelLayouts *f, - AVFilterChannelLayouts **ref); +int ff_channel_layouts_ref(AVFilterChannelLayouts *f, + AVFilterChannelLayouts **ref); /** * Remove a reference to a channel layouts list. @@ -233,7 +233,7 @@ AVFilterFormats *ff_merge_formats(AVFilterFormats *a, AVFilterFormats *b, * | |____| | | |____| * |________| |________________________ */ -void ff_formats_ref(AVFilterFormats *formats, AVFilterFormats **ref); +int ff_formats_ref(AVFilterFormats *formats, AVFilterFormats **ref); /** * If *ref is non-NULL, remove *ref as a reference to the format list |