Commit 211a185c authored by Paul B Mahol's avatar Paul B Mahol

avfilter/avfilter: check allocation failure in ff_insert_pad()

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 5ab7b3b9
...@@ -94,16 +94,25 @@ void ff_command_queue_pop(AVFilterContext *filter) ...@@ -94,16 +94,25 @@ void ff_command_queue_pop(AVFilterContext *filter)
av_free(c); av_free(c);
} }
void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, int ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
AVFilterPad **pads, AVFilterLink ***links, AVFilterPad **pads, AVFilterLink ***links,
AVFilterPad *newpad) AVFilterPad *newpad)
{ {
AVFilterLink **newlinks;
AVFilterPad *newpads;
unsigned i; unsigned i;
idx = FFMIN(idx, *count); idx = FFMIN(idx, *count);
*pads = av_realloc(*pads, sizeof(AVFilterPad) * (*count + 1)); newpads = av_realloc_array(*pads, *count + 1, sizeof(AVFilterPad));
*links = av_realloc(*links, sizeof(AVFilterLink*) * (*count + 1)); newlinks = av_realloc_array(*links, *count + 1, sizeof(AVFilterLink*));
if (newpads)
*pads = newpads;
if (newlinks)
*links = newlinks;
if (!newpads || !newlinks)
return AVERROR(ENOMEM);
memmove(*pads + idx + 1, *pads + idx, sizeof(AVFilterPad) * (*count - idx)); memmove(*pads + idx + 1, *pads + idx, sizeof(AVFilterPad) * (*count - idx));
memmove(*links + idx + 1, *links + idx, sizeof(AVFilterLink*) * (*count - idx)); memmove(*links + idx + 1, *links + idx, sizeof(AVFilterLink*) * (*count - idx));
memcpy(*pads + idx, newpad, sizeof(AVFilterPad)); memcpy(*pads + idx, newpad, sizeof(AVFilterPad));
...@@ -113,6 +122,8 @@ void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, ...@@ -113,6 +122,8 @@ void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
for (i = idx + 1; i < *count; i++) for (i = idx + 1; i < *count; i++)
if (*links[i]) if (*links[i])
(*(unsigned *)((uint8_t *) *links[i] + padidx_off))++; (*(unsigned *)((uint8_t *) *links[i] + padidx_off))++;
return 0;
} }
int avfilter_link(AVFilterContext *src, unsigned srcpad, int avfilter_link(AVFilterContext *src, unsigned srcpad,
......
...@@ -249,35 +249,38 @@ void ff_tlog_link(void *ctx, AVFilterLink *link, int end); ...@@ -249,35 +249,38 @@ void ff_tlog_link(void *ctx, AVFilterLink *link, int end);
* @param pads Pointer to the pointer to the beginning of the list of pads * @param pads Pointer to the pointer to the beginning of the list of pads
* @param links Pointer to the pointer to the beginning of the list of links * @param links Pointer to the pointer to the beginning of the list of links
* @param newpad The new pad to add. A copy is made when adding. * @param newpad The new pad to add. A copy is made when adding.
* @return >= 0 in case of success, a negative AVERROR code on error
*/ */
void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, int ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
AVFilterPad **pads, AVFilterLink ***links, AVFilterPad **pads, AVFilterLink ***links,
AVFilterPad *newpad); AVFilterPad *newpad);
/** Insert a new input pad for the filter. */ /** Insert a new input pad for the filter. */
static inline void ff_insert_inpad(AVFilterContext *f, unsigned index, static inline int ff_insert_inpad(AVFilterContext *f, unsigned index,
AVFilterPad *p) AVFilterPad *p)
{ {
ff_insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad), int ret = ff_insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad),
&f->input_pads, &f->inputs, p); &f->input_pads, &f->inputs, p);
#if FF_API_FOO_COUNT #if FF_API_FOO_COUNT
FF_DISABLE_DEPRECATION_WARNINGS FF_DISABLE_DEPRECATION_WARNINGS
f->input_count = f->nb_inputs; f->input_count = f->nb_inputs;
FF_ENABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS
#endif #endif
return ret;
} }
/** Insert a new output pad for the filter. */ /** Insert a new output pad for the filter. */
static inline void ff_insert_outpad(AVFilterContext *f, unsigned index, static inline int ff_insert_outpad(AVFilterContext *f, unsigned index,
AVFilterPad *p) AVFilterPad *p)
{ {
ff_insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad), int ret = ff_insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad),
&f->output_pads, &f->outputs, p); &f->output_pads, &f->outputs, p);
#if FF_API_FOO_COUNT #if FF_API_FOO_COUNT
FF_DISABLE_DEPRECATION_WARNINGS FF_DISABLE_DEPRECATION_WARNINGS
f->output_count = f->nb_outputs; f->output_count = f->nb_outputs;
FF_ENABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS
#endif #endif
return ret;
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment