diff --git a/ext/standard/tests/url/gh12703.phpt b/ext/standard/tests/url/gh12703.phpt new file mode 100644 index 0000000000000..c8e57c5246389 --- /dev/null +++ b/ext/standard/tests/url/gh12703.phpt @@ -0,0 +1,43 @@ +--TEST-- +GH-12703 parse_url() return false on absolute path containing ':' and no query string. +--FILE-- + +--EXPECT-- +array(1) { + ["path"]=> + string(7) "/page:1" +} +NULL +array(2) { + ["path"]=> + string(7) "/page:1" + ["query"]=> + string(7) "foo=bar" +} +array(2) { + ["host"]=> + string(14) "www.examle.com" + ["path"]=> + string(11) "/foo:65535/" +} +array(3) { + ["host"]=> + string(14) "www.examle.com" + ["port"]=> + int(8080) + ["path"]=> + string(11) "/foo:65535/" +} \ No newline at end of file diff --git a/ext/standard/url.c b/ext/standard/url.c index d19965fb2081c..6d9a59877f812 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -181,7 +181,10 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port p = e + 1; pp = p; + const char *first_slash = memchr(s, '/', ue - s); + while (pp < ue && pp - p < 6 && isdigit(*pp)) { + if (first_slash && pp >= first_slash) break; pp++; }