diff options
Diffstat (limited to 'src/c/urweb.c')
-rw-r--r-- | src/c/urweb.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c index 0ccc418a..8d44088d 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -4100,29 +4100,28 @@ uw_Basis_string uw_Basis_remainingFields(uw_context ctx, uw_Basis_postField f) { } uw_Basis_postField *uw_Basis_firstFormField(uw_context ctx, uw_Basis_string s) { - char *amp, *eq, *unurl, *copy; + char *unurl; uw_Basis_postField *f; - if (s[0] == 0) - return NULL; + if (!ctx->hasPostBody) + uw_error(ctx, FATAL, "firstFormField called when there is no POST body"); - amp = strchr(s, '&'); - copy = uw_malloc(ctx, amp ? amp - s + 1 : strlen(s) + 1); - if (amp) { - strncpy(copy, s, amp - s); - copy[amp - s] = 0; - } else - strcpy(copy, s); - - eq = strchr(copy, '='); - if (eq) - *eq++ = 0; + if (s < ctx->postBody.data || s >= ctx->postBody.data + ctx->postBody.len) + return NULL; f = uw_malloc(ctx, sizeof(uw_Basis_postField)); - unurl = copy; + unurl = s; f->name = uw_Basis_unurlifyString(ctx, &unurl); - f->value = eq ? (unurl = eq, uw_Basis_unurlifyString(ctx, &unurl)) : ""; - f->remaining = amp ? amp+1 : ""; + s = strchr(s, 0); + if (!s) + uw_error(ctx, FATAL, "firstFormField: Missing null terminator"); + ++s; + unurl = s; + f->value = uw_Basis_unurlifyString(ctx, &unurl); + s = strchr(s, 0); + if (!s) + uw_error(ctx, FATAL, "firstFormField: Missing null terminator"); + f->remaining = s+1; return f; } |