]> granicus.if.org Git - php/commitdiff
Fixed bug #54180 (parse_url() incorrectly parses path when ? in fragment)
authorPierrick Charron <pierrick@php.net>
Thu, 17 Mar 2011 18:02:58 +0000 (18:02 +0000)
committerPierrick Charron <pierrick@php.net>
Thu, 17 Mar 2011 18:02:58 +0000 (18:02 +0000)
NEWS
ext/standard/tests/url/bug54180.phpt [new file with mode: 0644]
ext/standard/url.c

diff --git a/NEWS b/NEWS
index 7d3789e5a9a62bdb8aeb5b274aa763d3c8fc227c..84e8f4e08f9548fe8454d63c19f8373778bbb515 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,7 +5,11 @@ PHP                                                                        NEWS
 - Zend Engine:
   . Fixed bug #54262 (Crash when assigning value to a dimension in a non-array).
     (Dmitry)
-    
+
+- Core:
+  . Fixed bug #54180 (parse_url() incorrectly parses path when ? in fragment).
+    (tomas dot brastavicius at quantum dot lt, Pierrick)
+
 - DBA extension:
   . Fixed bug #54242 (dba_insert returns true if key already exists). (Felipe)
 
diff --git a/ext/standard/tests/url/bug54180.phpt b/ext/standard/tests/url/bug54180.phpt
new file mode 100644 (file)
index 0000000..2e64e27
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug #54180 (parse_url() incorrectly parses path when ? in fragment)
+--FILE--
+<?php
+
+var_dump(parse_url("http://example.com/path/script.html?t=1#fragment?data"));
+var_dump(parse_url("http://example.com/path/script.html#fragment?data"));
+
+?>
+--EXPECTF--
+array(5) {
+  ["scheme"]=>
+  string(4) "http"
+  ["host"]=>
+  string(11) "example.com"
+  ["path"]=>
+  string(17) "/path/script.html"
+  ["query"]=>
+  string(3) "t=1"
+  ["fragment"]=>
+  string(13) "fragment?data"
+}
+array(4) {
+  ["scheme"]=>
+  string(4) "http"
+  ["host"]=>
+  string(11) "example.com"
+  ["path"]=>
+  string(17) "/path/script.html"
+  ["fragment"]=>
+  string(13) "fragment?data"
+}
index e4f71b146074707d2dc56361a03a674d90ca9c77..0f4b836e628f297b87445404b111ba7782f47e98 100644 (file)
@@ -316,6 +316,10 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
                pp = strchr(s, '#');
 
                if (pp && pp < p) {
+                       if (pp - s) {
+                               ret->path = estrndup(s, (pp-s));
+                               php_replace_controlchars_ex(ret->path, (pp - s));
+                       }
                        p = pp;
                        goto label_parse;
                }