Commit 1bf4be92ddb for php.net
commit 1bf4be92ddb8a14078be424400bf19a1b1779ab1
Merge: a182b7f1b10 2014eb2ccab
Author: Tim Düsterhus <tim@bastelstu.be>
Date: Sun Jul 12 19:56:46 2026 +0200
Merge branch 'PHP-8.5'
* PHP-8.5:
ext/uri: Fix GH-22629 WHATWG validation error incorrect with empty host and non-empty userinfo (#22699)
diff --cc NEWS
index 4be8d1e554c,bf4e4d2bdb5..f8fcd3556d1
--- a/NEWS
+++ b/NEWS
@@@ -81,22 -89,24 +81,26 @@@ PH
. Fixed bug GH-21314 (Different session garbage collector behavior between
PHP 8.3 and PHP 8.5). (jorgsowa)
-- SPL:
- . Fix class_parents for classes with leading slash in non-autoload mode.
- (jorgsowa)
- . Ignore leading back-slash in class_parents(), class_implements(), and
- class_uses(). (jorgsowa)
- . Fixed bug GH-16217 (SplFileObject::fputcsv() on an uninitialized object
- segfaults). (iliaal)
+- SOAP:
+ . Fixed bug GH-22585 (OOM on bailout with uninitialized
+ do_request() parameters). (David Carlier)
+ . Fixed xsd:hexBinary decoding to reject odd-length values instead of
+ silently truncating the last nibble. (Weilin Du)
- Standard:
- . Fixed bug GH-22395 (base_convert() outputs at most 64 characters).
- (Weilin Du)
+ . Fixed sleep() and usleep() to reject values that overflow the underlying
+ unsigned int timeout. (Weilin Du)
+ . Fixed bug GH-22671 (assert.bail aborts the process when the assert callback
+ throws an exception whose reporting re-throws). (iliaal)
+
+- Streams:
+ . Fixed bug GH-21468 (Segfault in file_get_contents w/ a https URL
+ and a proxy set). (CVE-2026-12184) (ndossche)
+ - URI:
- . Fixed behavior of Uri\WhatWg\Url wither methods with regards to empty
- opaque hosts. (kocsismate)
+ . Fixed bug GH-22629 (WHATWG Validation error incorrect with empty host and
+ non-empty userinfo). (kocsismate)
+
- Zip:
. Fixed bug GH-22649 (ZipArchive::setCommentName() and setCommentIndex()
could crash after overwriting an entry and resetting its inherited
diff --cc ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch
index e106b413c22,e106b413c22..53359883782
--- a/ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch
+++ b/ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Sat, 26 Aug 2023 15:08:59 +0200
--Subject: [PATCH 1/9] Expose line and column information for use in PHP
++Subject: [PATCH 01/10] Expose line and column information for use in PHP
---
source/lexbor/dom/interfaces/node.h | 2 ++
diff --cc ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch
index 9e83700198e,9e83700198e..8814d595535
--- a/ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch
+++ b/ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Mon, 14 Aug 2023 20:18:51 +0200
--Subject: [PATCH 2/9] Track implied added nodes for options use in PHP
++Subject: [PATCH 02/10] Track implied added nodes for options use in PHP
---
source/lexbor/html/tree.h | 3 +++
diff --cc ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch
index 9ed36fda109,9ed36fda109..aa480232049
--- a/ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch
+++ b/ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch
@@@ -1,8 -1,8 +1,8 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Thu, 24 Aug 2023 22:57:48 +0200
--Subject: [PATCH 3/9] Patch utilities and data structure to be able to generate
-- smaller lookup tables
++Subject: [PATCH 03/10] Patch utilities and data structure to be able to
++ generate smaller lookup tables
Changed the generation script to check if everything fits in 32-bits.
And change the actual field types to 32-bits. This decreases the hash
diff --cc ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch
index 9e9fcaf8db7,9e9fcaf8db7..1a28b21ccdc
--- a/ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch
+++ b/ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Wed, 29 Nov 2023 21:26:47 +0100
--Subject: [PATCH 4/9] Remove unused upper case tag static data
++Subject: [PATCH 04/10] Remove unused upper case tag static data
---
source/lexbor/tag/res.h | 2 ++
diff --cc ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch
index ce344816939,ce344816939..a1dda1fcd11
--- a/ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch
+++ b/ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Wed, 29 Nov 2023 21:29:31 +0100
--Subject: [PATCH 5/9] Shrink size of static binary search tree
++Subject: [PATCH 05/10] Shrink size of static binary search tree
This also makes it more efficient on the data cache.
---
diff --cc ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch
index c8f485f3480,c8f485f3480..57f1e0e92fc
--- a/ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch
+++ b/ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Sun, 7 Jan 2024 21:59:28 +0100
--Subject: [PATCH 6/9] Patch out unused CSS style code
++Subject: [PATCH 06/10] Patch out unused CSS style code
---
source/lexbor/css/rule.h | 2 ++
diff --cc ext/lexbor/patches/0007-Add-lxb_url_is_special-to-the-public-API-362.patch
index b56a1d1f06a,00000000000..ced72cbba90
mode 100644,000000..100644
--- a/ext/lexbor/patches/0007-Add-lxb_url_is_special-to-the-public-API-362.patch
+++ b/ext/lexbor/patches/0007-Add-lxb_url_is_special-to-the-public-API-362.patch
@@@ -1,44 -1,0 +1,44 @@@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= <kocsismate@woohoolabs.com>
+Date: Sun, 17 May 2026 22:17:14 +0200
- Subject: [PATCH 7/9] Add lxb_url_is_special() to the public API (#362)
++Subject: [PATCH 07/10] Add lxb_url_is_special() to the public API (#362)
+
+As https://wiki.php.net/rfc/uri_followup#uri_type_detection relies on this information.
+---
+ source/lexbor/url/url.c | 2 +-
+ source/lexbor/url/url.h | 9 +++++++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/source/lexbor/url/url.c b/source/lexbor/url/url.c
+index 5a11434..a5b323f 100644
+--- a/source/lexbor/url/url.c
++++ b/source/lexbor/url/url.c
+@@ -860,7 +860,7 @@ lxb_url_is_url_codepoint(lxb_codepoint_t cp)
+ return lxb_url_codepoint_alphanumeric[(lxb_char_t) cp] != 0xFF;
+ }
+
+-lxb_inline bool
++bool
+ lxb_url_is_special(const lxb_url_t *url)
+ {
+ return url->scheme.type != LXB_URL_SCHEMEL_TYPE__UNKNOWN;
+diff --git a/source/lexbor/url/url.h b/source/lexbor/url/url.h
+index 4ed3f32..6cc6f10 100644
+--- a/source/lexbor/url/url.h
++++ b/source/lexbor/url/url.h
+@@ -763,6 +763,15 @@ LXB_API lxb_status_t
+ lxb_url_search_params_serialize(lxb_url_search_params_t *search_params,
+ lexbor_callback_f cb, void *ctx);
+
++/**
++ * Returns whether the URL is special.
++ *
++ * @param[in] lxb_url_t *. Cannot be NULL.
++ * @return true if URL is special, false otherwise.
++ */
++LXB_API bool
++lxb_url_is_special(const lxb_url_t *url);
++
+ /*
+ * Inline functions.
+ */
diff --cc ext/lexbor/patches/0008-URL-fixed-setters-for-empty-hosts.patch
index de66962e7cc,56e206f63d2..233b42713c2
--- a/ext/lexbor/patches/0008-URL-fixed-setters-for-empty-hosts.patch
+++ b/ext/lexbor/patches/0008-URL-fixed-setters-for-empty-hosts.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Fri, 26 Jun 2026 18:55:56 +0300
- Subject: [PATCH 8/9] URL: fixed setters for empty hosts.
-Subject: [PATCH 7/9] URL: fixed setters for empty hosts.
++Subject: [PATCH 08/10] URL: fixed setters for empty hosts.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --cc ext/lexbor/patches/0009-URL-fixed-uninitialized-memory-in-the-path-buffer-gr.patch
index 0fde094eefd,c8cd2332eef..0b5ab2bce77
--- a/ext/lexbor/patches/0009-URL-fixed-uninitialized-memory-in-the-path-buffer-gr.patch
+++ b/ext/lexbor/patches/0009-URL-fixed-uninitialized-memory-in-the-path-buffer-gr.patch
@@@ -1,7 -1,7 +1,7 @@@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Fri, 5 Jun 2026 22:13:32 +0300
- Subject: [PATCH 9/9] URL: fixed uninitialized memory in the path buffer
-Subject: [PATCH 8/9] URL: fixed uninitialized memory in the path buffer
++Subject: [PATCH 09/10] URL: fixed uninitialized memory in the path buffer
growth.
When a path was long enough to outgrow the on-stack buffer, the first
diff --cc ext/lexbor/patches/0010-Fix-parsing-for-URL-containing-empty-host-and-userin.patch
index 00000000000,ef7743e6153..e0b45ab4973
mode 000000,100644..100644
--- a/ext/lexbor/patches/0010-Fix-parsing-for-URL-containing-empty-host-and-userin.patch
+++ b/ext/lexbor/patches/0010-Fix-parsing-for-URL-containing-empty-host-and-userin.patch
@@@ -1,0 -1,48 +1,48 @@@
+ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+ From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= <kocsismate@woohoolabs.com>
+ Date: Thu, 9 Jul 2026 21:51:05 +0200
-Subject: [PATCH 9/9] Fix parsing for URL containing empty host and userinfo
++Subject: [PATCH 10/10] Fix parsing for URL containing empty host and userinfo
+
+ The returned error code (LXB_URL_ERROR_TYPE_INVALID_CREDENTIALS) apparently contradicts the specification:
+
+ "If atSignSeen is true and buffer is the empty string, host-missing validation error, return failure."
+ ---
+ source/lexbor/url/url.c | 2 +-
+ test/files/lexbor/url/username_password.ton | 8 +++++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+ diff --git a/source/lexbor/url/url.c b/source/lexbor/url/url.c
-index b6c0a1e..19ec238 100644
++index 1fd044b..aed468a 100644
+ --- a/source/lexbor/url/url.c
+ +++ b/source/lexbor/url/url.c
+ @@ -1814,7 +1814,7 @@ again:
+ if (at_sign) {
+ if (begin == p || begin == p - 1) {
+ status = lxb_url_log_append(parser, p,
+ - LXB_URL_ERROR_TYPE_INVALID_CREDENTIALS);
+ + LXB_URL_ERROR_TYPE_HOST_MISSING);
+ if (status != LXB_STATUS_OK) {
+ lxb_url_parse_return(orig_data, buf, status);
+ }
+ diff --git a/test/files/lexbor/url/username_password.ton b/test/files/lexbor/url/username_password.ton
+ index 28a27fd..5a5e63e 100644
+ --- a/test/files/lexbor/url/username_password.ton
+ +++ b/test/files/lexbor/url/username_password.ton
+ @@ -1,5 +1,5 @@
+ [
+ - /* Test count: 11 */
+ + /* Test count: 12 */
+ /* 1 */
+ {
+ "url": "https://user:password@lexbor.com",
+ @@ -124,4 +124,10 @@
+ "failed": false,
+ "encoding": "utf-8"
+ }
+ + /* 12 */
+ + {
+ + "url": "https://user:pass@",
+ + "failed": true,
+ + "encoding": "utf-8"
+ + }
+ ]