X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_url.c;h=3ed2e3cbf2fd6beeee72a41ca50345b957efbdf6;hp=cce4ba7b16ed40bd9944a74243a788eec4a501e1;hb=1eaeb2c133a2e47327fe6cd6282db2a02527e57a;hpb=3db1f1fe45ab051a57f70f637618e02f7985406e diff --git a/src/php_http_url.c b/src/php_http_url.c index cce4ba7..3ed2e3c 100644 --- a/src/php_http_url.c +++ b/src/php_http_url.c @@ -263,6 +263,7 @@ php_http_url_t *php_http_url_mod(const php_http_url_t *old_url, const php_http_u /* replace directory references if path is not a single slash */ if ((flags & PHP_HTTP_URL_SANITIZE_PATH) + && url(buf)->path && url(buf)->path[0] && url(buf)->path[1]) { char *ptr, *end = url(buf)->path + strlen(url(buf)->path) + 1; @@ -1467,7 +1468,7 @@ static const char *parse_scheme(struct parse_state *state) case '7': case '8': case '9': case '+': case '-': case '.': if (state->ptr == tmp) { - return tmp; + goto softfail; } /* no break */ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': @@ -1484,19 +1485,20 @@ static const char *parse_scheme(struct parse_state *state) default: if (!(mb = parse_mb(state, PARSE_SCHEME, state->ptr, state->end, tmp, 1))) { - /* soft fail; parse path next */ - return tmp; + goto softfail; } state->ptr += mb - 1; } } while (++state->ptr != state->end); +softfail: + state->offset = 0; return state->ptr = tmp; } php_http_url_t *php_http_url_parse(const char *str, size_t len, unsigned flags) { - size_t maxlen = 3 * len; + size_t maxlen = 3 * len + 8 /* null bytes for all components */; struct parse_state *state = ecalloc(1, sizeof(*state) + maxlen); state->end = str + len;