diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2015-04-22 21:11:21 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2015-04-22 21:11:21 +0100 |
commit | df3a8894357444704ec6c72df2dd3b2161e3f4c7 (patch) | |
tree | bbc3796bbb6452f3b1ebd51bdf7bfe84e8c32de1 /render | |
parent | e7f9dbcb10594a46c559d0ae7c7ed26ede8af9a2 (diff) | |
download | netsurf-df3a8894357444704ec6c72df2dd3b2161e3f4c7.tar.gz netsurf-df3a8894357444704ec6c72df2dd3b2161e3f4c7.tar.bz2 |
Ensure we delink form controls when freeing them
Diffstat (limited to 'render')
-rw-r--r-- | render/form.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/render/form.c b/render/form.c index a2b661e39..34029df44 100644 --- a/render/form.c +++ b/render/form.c @@ -215,6 +215,7 @@ void form_add_control(struct form *form, struct form_control *control) */ void form_free_control(struct form_control *control) { + struct form_control *c; assert(control != NULL); LOG(("Control:%p name:%p value:%p initial:%p", control, control->name, control->value, control->initial_value)); @@ -251,6 +252,24 @@ void form_free_control(struct form_control *control) } } + /* unlink the control from the form */ + for (c = control->form->controls; c != NULL; c = c->next) { + if (c->next == control) { + c->next = control->next; + if (control->form->last_control == control) + control->form->last_control = c; + break; + } + if (c == control) { + /* can only happen if control was first control */ + control->form->controls = control->next; + if (control->form->last_control == control) + control->form->controls = + control->form->last_control = NULL; + break; + } + } + free(control); } |