From 51dc5aad0fabaa35df27bc5b112d21bc470cc212 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 4 Feb 2025 13:37:47 +0100 Subject: Fixed crash. --- xs_url.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xs_url.h') diff --git a/xs_url.h b/xs_url.h index 3c24736..81dd668 100644 --- a/xs_url.h +++ b/xs_url.h @@ -69,7 +69,7 @@ xs_dict *xs_url_vars(const char *str) vars = xs_dict_new(); - if (str != NULL) { + if (xs_is_string(str)) { /* split by arguments */ xs *args = xs_split(str, "&"); -- cgit From a33cdf29070a7bd0e46fc1484c98508ca959c1fa Mon Sep 17 00:00:00 2001 From: default Date: Tue, 4 Feb 2025 16:10:52 +0100 Subject: Another crash fix. --- xs_url.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'xs_url.h') diff --git a/xs_url.h b/xs_url.h index 81dd668..fd320a4 100644 --- a/xs_url.h +++ b/xs_url.h @@ -23,6 +23,9 @@ xs_str *xs_url_dec(const char *str) if (sscanf(str + 1, "%02x", &i) == 1) { unsigned char uc = i; + if (!xs_is_string((char *)&uc)) + break; + s = xs_append_m(s, (char *)&uc, 1); str += 2; } -- cgit From 636d026e133d874daf39a84a7702253454644926 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 4 Feb 2025 16:24:21 +0100 Subject: More xs_url_dec() fixes. --- xs_url.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'xs_url.h') diff --git a/xs_url.h b/xs_url.h index fd320a4..8e2e243 100644 --- a/xs_url.h +++ b/xs_url.h @@ -17,6 +17,9 @@ xs_str *xs_url_dec(const char *str) xs_str *s = xs_str_new(NULL); while (*str) { + if (!xs_is_string(str)) + break; + if (*str == '%') { unsigned int i; -- cgit From 0155ccfa5280b8e95aca8f085bd3114213d506a6 Mon Sep 17 00:00:00 2001 From: Santtu Lakkala Date: Thu, 6 Feb 2025 00:47:23 +0200 Subject: Rewrite query string decoding --- xs_url.h | 103 ++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 34 deletions(-) (limited to 'xs_url.h') diff --git a/xs_url.h b/xs_url.h index 8e2e243..bb31779 100644 --- a/xs_url.h +++ b/xs_url.h @@ -11,6 +11,39 @@ xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *hea #ifdef XS_IMPLEMENTATION +char *xs_url_dec_in(char *str, int qs) +{ + char *w = str; + char *r; + + for (r = str; *r != '\0'; r++) { + switch (*r) { + case '%': { + unsigned hex; + if (!r[1] || !r[2]) + return NULL; + if (sscanf(r + 1, "%2x", &hex) != 1) + return NULL; + *w++ = hex; + r += 2; + break; + } + + case '+': + if (qs) { + *w++ = ' '; + break; + } + /* fall-through */ + default: + *w++ = *r; + } + } + + *w++ = '\0'; + return str; +} + xs_str *xs_url_dec(const char *str) /* decodes an URL */ { @@ -76,42 +109,44 @@ xs_dict *xs_url_vars(const char *str) vars = xs_dict_new(); if (xs_is_string(str)) { - /* split by arguments */ - xs *args = xs_split(str, "&"); - - const xs_val *v; - - xs_list_foreach(args, v) { - xs *dv = xs_url_dec(v); - xs *kv = xs_split_n(dv, "=", 1); - - if (xs_list_len(kv) == 2) { - const char *key = xs_list_get(kv, 0); - const char *pv = xs_dict_get(vars, key); - - if (!xs_is_null(pv)) { - /* there is a previous value: convert to a list and append */ - xs *vlist = NULL; - if (xs_type(pv) == XSTYPE_LIST) - vlist = xs_dup(pv); - else { - vlist = xs_list_new(); - vlist = xs_list_append(vlist, pv); - } - - vlist = xs_list_append(vlist, xs_list_get(kv, 1)); - vars = xs_dict_set(vars, key, vlist); - } + xs *dup = xs_dup(str); + char *k; + char *saveptr; + for (k = strtok_r(dup, "&", &saveptr); + k; + k = strtok_r(NULL, "&", &saveptr)) { + char *v = strchr(k, '='); + if (!v) + continue; + *v++ = '\0'; + k = xs_url_dec_in(k, 1); + v = xs_url_dec_in(v, 1); + if (!xs_is_string(k) || !xs_is_string(v)) + continue; + + const char *pv = xs_dict_get(vars, k); + if (!xs_is_null(pv)) { + /* there is a previous value: convert to a list and append */ + xs *vlist = NULL; + if (xs_type(pv) == XSTYPE_LIST) + vlist = xs_dup(pv); else { - /* ends with []? force to always be a list */ - if (xs_endswith(key, "[]")) { - xs *vlist = xs_list_new(); - vlist = xs_list_append(vlist, xs_list_get(kv, 1)); - vars = xs_dict_append(vars, key, vlist); - } - else - vars = xs_dict_append(vars, key, xs_list_get(kv, 1)); + vlist = xs_list_new(); + vlist = xs_list_append(vlist, pv); + } + + vlist = xs_list_append(vlist, v); + vars = xs_dict_set(vars, k, vlist); + } + else { + /* ends with []? force to always be a list */ + if (xs_endswith(k, "[]")) { + xs *vlist = xs_list_new(); + vlist = xs_list_append(vlist, v); + vars = xs_dict_append(vars, k, vlist); } + else + vars = xs_dict_append(vars, k, v); } } } -- cgit From 3099d179be9ffb38753e412480e23e5391913751 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 6 Feb 2025 20:10:52 +0100 Subject: Fixed a crash in xs_multipart_form_data(). --- xs_url.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'xs_url.h') diff --git a/xs_url.h b/xs_url.h index bb31779..37d2391 100644 --- a/xs_url.h +++ b/xs_url.h @@ -274,7 +274,8 @@ xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *hea l1 = xs_list_append(l1, vpo); l1 = xs_list_append(l1, vps); - p_vars = xs_dict_append(p_vars, vn, l1); + if (xs_is_string(vn)) + p_vars = xs_dict_append(p_vars, vn, l1); } else { /* regular variable; just copy */ @@ -282,7 +283,8 @@ xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *hea memcpy(vc, payload + po, ps); vc[ps] = '\0'; - p_vars = xs_dict_append(p_vars, vn, vc); + if (xs_is_string(vn) && xs_is_string(vc)) + p_vars = xs_dict_append(p_vars, vn, vc); } /* move on */ -- cgit