vf_pullup: simplify, fix double free error
The memory allocation for f->diffs was freed multiple times in some corner cases. Simplify the code so that this doesn't happen. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
54e2e9fbc1
commit
5b0ce5d4e3
@ -126,20 +126,20 @@ static int alloc_metrics(PullupContext *s, PullupField *f)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_field_queue(PullupField *head, PullupField **last)
|
static void free_field_queue(PullupField *head)
|
||||||
{
|
{
|
||||||
PullupField *f = head;
|
PullupField *f = head;
|
||||||
while (f) {
|
do {
|
||||||
|
PullupField *next;
|
||||||
|
if (!f)
|
||||||
|
break;
|
||||||
av_free(f->diffs);
|
av_free(f->diffs);
|
||||||
av_free(f->combs);
|
av_free(f->combs);
|
||||||
av_free(f->vars);
|
av_free(f->vars);
|
||||||
if (f == *last) {
|
next = f->next;
|
||||||
av_freep(last);
|
av_free(f);
|
||||||
break;
|
f = next;
|
||||||
}
|
} while (f != head);
|
||||||
f = f->next;
|
|
||||||
av_freep(&f->prev);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PullupField *make_field_queue(PullupContext *s, int len)
|
static PullupField *make_field_queue(PullupContext *s, int len)
|
||||||
@ -158,14 +158,14 @@ static PullupField *make_field_queue(PullupContext *s, int len)
|
|||||||
for (; len > 0; len--) {
|
for (; len > 0; len--) {
|
||||||
f->next = av_mallocz(sizeof(*f->next));
|
f->next = av_mallocz(sizeof(*f->next));
|
||||||
if (!f->next) {
|
if (!f->next) {
|
||||||
free_field_queue(head, &f);
|
free_field_queue(head);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
f->next->prev = f;
|
f->next->prev = f;
|
||||||
f = f->next;
|
f = f->next;
|
||||||
if (alloc_metrics(s, f) < 0) {
|
if (alloc_metrics(s, f) < 0) {
|
||||||
free_field_queue(head, &f);
|
free_field_queue(head);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -736,7 +736,8 @@ static av_cold void uninit(AVFilterContext *ctx)
|
|||||||
PullupContext *s = ctx->priv;
|
PullupContext *s = ctx->priv;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
free_field_queue(s->head, &s->last);
|
free_field_queue(s->head);
|
||||||
|
s->last = NULL;
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(s->buffers); i++) {
|
for (i = 0; i < FF_ARRAY_ELEMS(s->buffers); i++) {
|
||||||
av_freep(&s->buffers[i].planes[0]);
|
av_freep(&s->buffers[i].planes[0]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user