summaryrefslogtreecommitdiff
path: root/render/form.c
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2015-04-22 21:11:21 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2015-04-22 21:11:21 +0100
commitdf3a8894357444704ec6c72df2dd3b2161e3f4c7 (patch)
treebbc3796bbb6452f3b1ebd51bdf7bfe84e8c32de1 /render/form.c
parente7f9dbcb10594a46c559d0ae7c7ed26ede8af9a2 (diff)
downloadnetsurf-df3a8894357444704ec6c72df2dd3b2161e3f4c7.tar.gz
netsurf-df3a8894357444704ec6c72df2dd3b2161e3f4c7.tar.bz2
Ensure we delink form controls when freeing them
Diffstat (limited to 'render/form.c')
-rw-r--r--render/form.c19
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);
}