diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2009-11-04 13:44:10 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2009-11-04 13:44:10 +0000 |
commit | 41611fd003b60fcc3a9e0566acb2848416639da5 (patch) | |
tree | 543bebed0a7d9ae717487690f1435c773212492b /ext/standard/url.c | |
parent | 973d7badd5e285c9140c15500193026b86833875 (diff) | |
download | php-git-41611fd003b60fcc3a9e0566acb2848416639da5.tar.gz |
Fixed bug #50073 (parse_url() incorrect when ? in fragment).
Diffstat (limited to 'ext/standard/url.c')
-rw-r--r-- | ext/standard/url.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/ext/standard/url.c b/ext/standard/url.c index 61bc393ea1..15c6a11109 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -201,10 +201,21 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length) e = ue; if (!(p = memchr(s, '/', (ue - s)))) { - if ((p = memchr(s, '?', (ue - s)))) { - e = p; - } else if ((p = memchr(s, '#', (ue - s)))) { - e = p; + char *query, *fragment; + + query = memchr(s, '?', (ue - s)); + fragment = memchr(s, '#', (ue - s)); + + if (query && fragment) { + if (query > fragment) { + p = e = fragment; + } else { + p = e = query; + } + } else if (query) { + p = e = query; + } else if (fragment) { + p = e = fragment; } } else { e = p; @@ -285,10 +296,10 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length) if ((p = memchr(s, '?', (ue - s)))) { pp = strchr(s, '#'); - + if (pp && pp < p) { p = pp; - pp = strchr(pp+2, '#'); + goto label_parse; } if (p - s) { |