summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/tests/url/bug68917.phpt23
-rw-r--r--ext/standard/url.c7
2 files changed, 28 insertions, 2 deletions
diff --git a/ext/standard/tests/url/bug68917.phpt b/ext/standard/tests/url/bug68917.phpt
new file mode 100644
index 0000000000..620c8f7285
--- /dev/null
+++ b/ext/standard/tests/url/bug68917.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #68917 (parse_url fails on some partial urls)
+--FILE--
+<?php
+print_r(parse_url('//example.org:81/hi?a=b#c=d'));
+print_r(parse_url('//example.org/hi?a=b#c=d'));
+?>
+--EXPECT--
+Array
+(
+ [host] => example.org
+ [port] => 81
+ [path] => /hi
+ [query] => a=b
+ [fragment] => c=d
+)
+Array
+(
+ [host] => example.org
+ [path] => /hi
+ [query] => a=b
+ [fragment] => c=d
+)
diff --git a/ext/standard/url.c b/ext/standard/url.c
index 31b027a98d..2f56d3186d 100644
--- a/ext/standard/url.c
+++ b/ext/standard/url.c
@@ -192,6 +192,9 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
port = strtol(port_buf, NULL, 10);
if (port > 0 && port <= 65535) {
ret->port = (unsigned short) port;
+ if (*s == '/' && *(s + 1) == '/') { /* relative-scheme URL */
+ s += 2;
+ }
} else {
STR_FREE(ret->scheme);
efree(ret);
@@ -201,12 +204,12 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
STR_FREE(ret->scheme);
efree(ret);
return NULL;
- } else if (*s == '/' && *(s+1) == '/') { /* relative-scheme URL */
+ } else if (*s == '/' && *(s + 1) == '/') { /* relative-scheme URL */
s += 2;
} else {
goto just_path;
}
- } else if (*s == '/' && *(s+1) == '/') { /* relative-scheme URL */
+ } else if (*s == '/' && *(s + 1) == '/') { /* relative-scheme URL */
s += 2;
} else {
just_path: