[project @ 2004-08-18 01:36:39 by jmb]

Fix issue with hidden inputs having no value property
Log on memory error to aid debugging

svn path=/import/netsurf/; revision=1242
This commit is contained in:
John Mark Bell 2004-08-18 01:36:39 +00:00
parent 21b9ca0bf1
commit 4ff7d738bc

View File

@ -16,6 +16,7 @@
#include "curl/curl.h" #include "curl/curl.h"
#include "netsurf/render/box.h" #include "netsurf/render/box.h"
#include "netsurf/render/form.h" #include "netsurf/render/form.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/utils.h" #include "netsurf/utils/utils.h"
@ -130,13 +131,28 @@ bool form_successful_controls(struct form *form,
if (!control->name) if (!control->name)
continue; continue;
/* ignore controls with no value */
/* this fixes ebay silliness
* From the spec:
* "If a control doesn't have a current value when the
* form is submitted, user agents are not required to
* treat it as a successful control"
*/
if (!control->value)
continue;
switch (control->type) { switch (control->type) {
case GADGET_HIDDEN: case GADGET_HIDDEN:
case GADGET_TEXTBOX: case GADGET_TEXTBOX:
case GADGET_PASSWORD: case GADGET_PASSWORD:
value = strdup(control->value); value = strdup(control->value);
if (!value) if (!value) {
LOG(("failed to duplicate value"
"'%s' for control %s",
control->value,
control->name));
goto no_memory; goto no_memory;
}
break; break;
case GADGET_RADIO: case GADGET_RADIO:
@ -146,8 +162,13 @@ bool form_successful_controls(struct form *form,
if (!control->selected) if (!control->selected)
continue; continue;
value = strdup(control->value); value = strdup(control->value);
if (!value) if (!value) {
LOG(("failed to duplicate value"
"'%s' for control %s",
control->value,
control->name));
goto no_memory; goto no_memory;
}
break; break;
case GADGET_SELECT: case GADGET_SELECT:
@ -158,8 +179,10 @@ bool form_successful_controls(struct form *form,
if (!option->selected) if (!option->selected)
continue; continue;
success_new = malloc(sizeof(*success_new)); success_new = malloc(sizeof(*success_new));
if (!success_new) if (!success_new) {
LOG(("malloc failed"));
goto no_memory; goto no_memory;
}
success_new->file = false; success_new->file = false;
success_new->name = strdup(control->name); success_new->name = strdup(control->name);
success_new->value = strdup(option->value); success_new->value = strdup(option->value);
@ -167,9 +190,11 @@ bool form_successful_controls(struct form *form,
last_success->next = success_new; last_success->next = success_new;
last_success = success_new; last_success = success_new;
if (!success_new->name || if (!success_new->name ||
!success_new->value) !success_new->value) {
LOG(("strdup failed"));
goto no_memory; goto no_memory;
} }
}
continue; continue;
break; break;
@ -177,8 +202,10 @@ bool form_successful_controls(struct form *form,
case GADGET_TEXTAREA: case GADGET_TEXTAREA:
/* textarea */ /* textarea */
value = form_textarea_value(control); value = form_textarea_value(control);
if (!value) if (!value) {
LOG(("failed handling textarea"));
goto no_memory; goto no_memory;
}
if (value[0] == 0) { if (value[0] == 0) {
free(value); free(value);
continue; continue;
@ -191,8 +218,10 @@ bool form_successful_controls(struct form *form,
/* x */ /* x */
success_new = malloc(sizeof(*success_new)); success_new = malloc(sizeof(*success_new));
if (!success_new) if (!success_new) {
LOG(("malloc failed"));
goto no_memory; goto no_memory;
}
success_new->file = false; success_new->file = false;
success_new->name = malloc(len); success_new->name = malloc(len);
success_new->value = malloc(20); success_new->value = malloc(20);
@ -201,6 +230,7 @@ bool form_successful_controls(struct form *form,
free(success_new->name); free(success_new->name);
free(success_new->value); free(success_new->value);
free(success_new); free(success_new);
LOG(("malloc failed"));
goto no_memory; goto no_memory;
} }
sprintf(success_new->name, "%s.x", sprintf(success_new->name, "%s.x",
@ -213,8 +243,10 @@ bool form_successful_controls(struct form *form,
/* y */ /* y */
success_new = malloc(sizeof(*success_new)); success_new = malloc(sizeof(*success_new));
if (!success_new) if (!success_new) {
LOG(("malloc failed"));
goto no_memory; goto no_memory;
}
success_new->file = false; success_new->file = false;
success_new->name = malloc(len); success_new->name = malloc(len);
success_new->value = malloc(20); success_new->value = malloc(20);
@ -223,6 +255,7 @@ bool form_successful_controls(struct form *form,
free(success_new->name); free(success_new->name);
free(success_new->value); free(success_new->value);
free(success_new); free(success_new);
LOG(("malloc failed"));
goto no_memory; goto no_memory;
} }
sprintf(success_new->name, "%s.y", sprintf(success_new->name, "%s.y",
@ -243,8 +276,13 @@ bool form_successful_controls(struct form *form,
if (control != submit_button) if (control != submit_button)
continue; continue;
value = strdup(control->value); value = strdup(control->value);
if (!value) if (!value) {
LOG(("failed to duplicate value"
"'%s' for control %s",
control->value,
control->name));
goto no_memory; goto no_memory;
}
break; break;
case GADGET_RESET: case GADGET_RESET:
@ -257,16 +295,21 @@ bool form_successful_controls(struct form *form,
if (!control->value) if (!control->value)
continue; continue;
success_new = malloc(sizeof(*success_new)); success_new = malloc(sizeof(*success_new));
if (!success_new) if (!success_new) {
LOG(("malloc failed"));
goto no_memory; goto no_memory;
}
success_new->file = true; success_new->file = true;
success_new->name = strdup(control->name); success_new->name = strdup(control->name);
success_new->value = strdup(control->value); success_new->value = strdup(control->value);
success_new->next = 0; success_new->next = 0;
last_success->next = success_new; last_success->next = success_new;
last_success = success_new; last_success = success_new;
if (!success_new->name || !success_new->value) if (!success_new->name ||
!success_new->value) {
LOG(("strdup failed"));
goto no_memory; goto no_memory;
}
continue; continue;
break; break;
@ -277,17 +320,22 @@ bool form_successful_controls(struct form *form,
} }
success_new = malloc(sizeof(*success_new)); success_new = malloc(sizeof(*success_new));
if (!success_new) if (!success_new) {
LOG(("malloc failed"));
goto no_memory; goto no_memory;
}
success_new->file = false; success_new->file = false;
success_new->name = strdup(control->name); success_new->name = strdup(control->name);
success_new->value = value; success_new->value = value;
success_new->next = NULL; success_new->next = NULL;
last_success->next = success_new; last_success->next = success_new;
last_success = success_new; last_success = success_new;
if (!success_new->name) if (!success_new->name) {
LOG(("failed to duplicate name '%s'",
control->name));
goto no_memory; goto no_memory;
} }
}
*successful_controls = sentinel.next; *successful_controls = sentinel.next;
return true; return true;