Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ PHP NEWS
after a dot segment in a path, replacement file drive paths, the output
encoding used for percent-encoding, the URLSearchParams tail pointer and
fragment serialization without a query. (alexandre-daubois)
. Merge patch lexbor/lexbor@f4cbbcd, fixing lexbor_array_obj_t allocating 8
times the memory it uses. (Nicolas Grekas)

- LibXML:
. Clear the libxml last error in libxml_use_internal_errors(false).
Expand Down
5 changes: 3 additions & 2 deletions ext/dom/tests/gh25118.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ dom
--SKIPIF--
<?php
if (PHP_INT_SIZE != 8) die("skip 64-bit only");
if (getenv("USE_ZEND_ALLOC") === "0") die("skip Zend MM disabled");
?>
--INI--
memory_limit=32M
memory_limit=26M
--FILE--
<?php
$html = '<template><p>t</p><template><b>n</b></template></template><main>' . str_repeat('<i></i>', 100000) . '</main>';
Dom\HTMLDocument::createFromString($html, LIBXML_NOERROR);
?>
--EXPECTF--
Fatal error: Allowed memory size of 33554432 bytes exhausted %S(tried to allocate %d bytes) in %s on line %d
Fatal error: Allowed memory size of 27262976 bytes exhausted %S(tried to allocate %d bytes) in %s on line %d
9 changes: 3 additions & 6 deletions ext/lexbor/lexbor/core/array_obj.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ lexbor_array_obj_init(lexbor_array_obj_t *array,
array->size = size;
array->struct_size = struct_size;

array->list = lexbor_malloc(sizeof(uint8_t *)
* (array->size * struct_size));
array->list = lexbor_malloc(array->size * struct_size);
if (array->list == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
Expand Down Expand Up @@ -77,8 +76,7 @@ lexbor_array_obj_expand(lexbor_array_obj_t *array, size_t up_to)

new_size = array->length + up_to;

list = lexbor_realloc(array->list, sizeof(uint8_t *)
* (new_size * array->struct_size));
list = lexbor_realloc(array->list, new_size * array->struct_size);
if (list == NULL) {
return NULL;
}
Expand Down Expand Up @@ -170,8 +168,7 @@ lexbor_array_obj_delete(lexbor_array_obj_t *array, size_t begin, size_t length)

memmove(&array->list[ begin * array->struct_size ],
&array->list[ end_len * array->struct_size ],
sizeof(uint8_t *)
* ((array->length - end_len) * array->struct_size));
(array->length - end_len) * array->struct_size);

array->length -= length;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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 01/24] Expose line and column information for use in PHP
Subject: [PATCH 01/25] Expose line and column information for use in PHP

---
source/lexbor/dom/interfaces/node.h | 2 ++
Expand Down
Original file line number Diff line number Diff line change
@@ -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 02/24] Track implied added nodes for options use in PHP
Subject: [PATCH 02/25] Track implied added nodes for options use in PHP

---
source/lexbor/html/tree.h | 3 +++
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
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 03/24] Patch utilities and data structure to be able to
Subject: [PATCH 03/25] 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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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 04/24] Remove unused upper case tag static data
Subject: [PATCH 04/25] Remove unused upper case tag static data

---
source/lexbor/tag/res.h | 2 ++
Expand Down
Original file line number Diff line number Diff line change
@@ -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 05/24] Shrink size of static binary search tree
Subject: [PATCH 05/25] Shrink size of static binary search tree

This also makes it more efficient on the data cache.
---
Expand Down
Original file line number Diff line number Diff line change
@@ -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 06/24] Patch out unused CSS style code
Subject: [PATCH 06/25] Patch out unused CSS style code

---
source/lexbor/css/rule.h | 2 ++
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
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 07/24] Add lxb_url_is_special() to the public API (#362)
Subject: [PATCH 07/25] 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.
---
Expand Down
Original file line number Diff line number Diff line change
@@ -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 08/24] URL: fixed setters for empty hosts.
Subject: [PATCH 08/25] URL: fixed setters for empty hosts.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Expand Down
Original file line number Diff line number Diff line change
@@ -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 09/24] URL: fixed uninitialized memory in the path buffer
Subject: [PATCH 09/25] URL: fixed uninitialized memory in the path buffer
growth.

When a path was long enough to outgrow the on-stack buffer, the first
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
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 10/24] Fix parsing for URL containing empty host and userinfo
Subject: [PATCH 10/25] Fix parsing for URL containing empty host and userinfo

The returned error code (LXB_URL_ERROR_TYPE_INVALID_CREDENTIALS) apparently contradicts the specification:

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= <kocsismate@woohoolabs.com>
Date: Fri, 10 Jul 2026 22:31:16 +0200
Subject: [PATCH 11/24] Percent-encode the caret in the path
Subject: [PATCH 11/25] Percent-encode the caret in the path

The caret (^) is part of the path percent-encode set:

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Wed, 12 Aug 2026 23:29:20 +0300
Subject: [PATCH 12/24] URL: added public IPv6 parser.
Subject: [PATCH 12/25] URL: added public IPv6 parser.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Thu, 13 Aug 2026 23:29:16 +0300
Subject: [PATCH 13/24] URL: added public percent-encoder API.
Subject: [PATCH 13/25] URL: added public percent-encoder API.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Expand Down
Original file line number Diff line number Diff line change
@@ -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:34:23 +0300
Subject: [PATCH 14/24] CSS: fixed heap buffer overflow in :lexbor-contains()
Subject: [PATCH 14/25] CSS: fixed heap buffer overflow in :lexbor-contains()
parsing.

The contains string buffer was allocated by the size of the string
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Wed, 10 Jun 2026 19:50:10 +0300
Subject: [PATCH 15/24] Encoding: fixed buffer overflows in malformed decode
Subject: [PATCH 15/25] Encoding: fixed buffer overflows in malformed decode
replay.

Fixed out-of-bounds writes in buffering decoders when replacement output
Expand Down
Original file line number Diff line number Diff line change
@@ -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 21:46:26 +0300
Subject: [PATCH 16/24] URL: fixed tail pointer in URLSearchParams for
Subject: [PATCH 16/25] URL: fixed tail pointer in URLSearchParams for
delimiter-free query.

When a query had a single token without '=' or '&' (e.g. "?abc"), the
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= <tim@bastelstu.be>
Date: Fri, 31 Jul 2026 20:56:18 +0200
Subject: [PATCH 17/24] URL: Fix parsing of usernames containing `@`
Subject: [PATCH 17/25] URL: Fix parsing of usernames containing `@`

Fixes lexbor/lexbor#399.
---
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Mon, 7 Sep 2026 22:11:39 +0300
Subject: [PATCH 18/24] Unicode: fixed uninitialized memory in IDNA buffer
Subject: [PATCH 18/25] Unicode: fixed uninitialized memory in IDNA buffer
growth.

When an IDNA buffer outgrew the stack allocation, the move to the heap
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= <kocsismate@woohoolabs.com>
Date: Fri, 11 Sep 2026 21:58:45 +0200
Subject: [PATCH 19/24] URL: encode opaque path spaces before query and
Subject: [PATCH 19/25] URL: encode opaque path spaces before query and
fragment. (#405)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= <tim@tideways-gmbh.com>
Date: Fri, 11 Sep 2026 22:45:33 +0200
Subject: [PATCH 20/24] URL: Fix `lxb_url_serialize_fragment()` without a query
Subject: [PATCH 20/25] URL: Fix `lxb_url_serialize_fragment()` without a query
(#410)

The `lxb_url_serialize_fragment()` function checked if the query contained data
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= <kocsismate@woohoolabs.com>
Date: Tue, 22 Sep 2026 22:20:28 +0200
Subject: [PATCH 21/24] URL: expose component reset functions. (#415)
Subject: [PATCH 21/25] URL: expose component reset functions. (#415)

* URL: expose component reset functions.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= <tim@tideways-gmbh.com>
Date: Sat, 26 Sep 2026 18:41:05 +0200
Subject: [PATCH 22/24] URL: Fix parsing of query and fragment after a
Subject: [PATCH 22/25] URL: Fix parsing of query and fragment after a
dot-component in path (#411)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= <kocsismate@woohoolabs.com>
Date: Mon, 21 Sep 2026 20:01:43 +0200
Subject: [PATCH 23/24] URL: Keep replacement file drive paths hierarchical
Subject: [PATCH 23/25] URL: Keep replacement file drive paths hierarchical
(#423)

WHATWG file state (https://url.spec.whatwg.org/#file-state) step 4.4.3.2 resets the path to an empty list. Do not mark it opaque, as that makes subsequent pathname updates silently do nothing.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alexander Borisov <lex.borisov@gmail.com>
Date: Thu, 24 Sep 2026 15:05:51 +0300
Subject: [PATCH 24/24] URL: normalize output encoding for percent-encoding.
Subject: [PATCH 24/25] URL: normalize output encoding for percent-encoding.

---
source/lexbor/url/url.c | 34 +++++++++++++++++++++++++---------
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Nicolas Grekas <nicolas.grekas@gmail.com>
Date: Mon, 28 Sep 2026 21:25:27 +0200
Subject: [PATCH 25/25] Core: fixed allocation and move sizes in
lexbor_array_obj_t. (#428)

lexbor_array_obj_init() and lexbor_array_obj_expand() multiplied the
number of bytes they need by sizeof(uint8_t *), so they allocated 8
times too much memory on 64-bit platforms. lexbor_array_obj_delete()
moved 8 times the bytes of the remaining entries too, which only stayed
within bounds thanks to the oversized allocation.

Added tests for the allocated sizes and for the entries after the last
one being left untouched by lexbor_array_obj_delete().
---
source/lexbor/core/array_obj.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/source/lexbor/core/array_obj.c b/source/lexbor/core/array_obj.c
index 79a4c3a..8cceaf9 100644
--- a/source/lexbor/core/array_obj.c
+++ b/source/lexbor/core/array_obj.c
@@ -29,8 +29,7 @@ lexbor_array_obj_init(lexbor_array_obj_t *array,
array->size = size;
array->struct_size = struct_size;

- array->list = lexbor_malloc(sizeof(uint8_t *)
- * (array->size * struct_size));
+ array->list = lexbor_malloc(array->size * struct_size);
if (array->list == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
@@ -77,8 +76,7 @@ lexbor_array_obj_expand(lexbor_array_obj_t *array, size_t up_to)

new_size = array->length + up_to;

- list = lexbor_realloc(array->list, sizeof(uint8_t *)
- * (new_size * array->struct_size));
+ list = lexbor_realloc(array->list, new_size * array->struct_size);
if (list == NULL) {
return NULL;
}
@@ -170,8 +168,7 @@ lexbor_array_obj_delete(lexbor_array_obj_t *array, size_t begin, size_t length)

memmove(&array->list[ begin * array->struct_size ],
&array->list[ end_len * array->struct_size ],
- sizeof(uint8_t *)
- * ((array->length - end_len) * array->struct_size));
+ (array->length - end_len) * array->struct_size);

array->length -= length;
}
Loading