1
0
mirror of https://github.com/php/php-src.git synced 2026-04-07 08:02:49 +02:00
Commit Graph

132284 Commits

Author SHA1 Message Date
Jakub Zelenka
85ce391172 Update versions for PHP 8.3.0alpha1 php-8.3.0alpha1 2023-06-06 16:47:23 +01:00
George Peter Banyard
a02f7f24c6 Use more appropriate types for php_array_walk() function 2023-06-06 12:12:07 +01:00
Dmitry Stogov
376b1efa7f Merge branch 'PHP-8.2'
* PHP-8.2:
  Fixed deoptimization info for interrupt handler
2023-06-06 13:30:35 +03:00
Dmitry Stogov
724e64fbda Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1:
  Fixed deoptimization info for interrupt handler
2023-06-06 13:30:21 +03:00
Dmitry Stogov
8f06febedf Fixed deoptimization info for interrupt handler 2023-06-06 13:29:55 +03:00
George Peter Banyard
99fa740acb Use common function for TypeError on illegal offset access (#10544)
This merges all usages of emitting an offset TypeError into a new ZEND_API function
zend_illegal_container_offset(const zend_string* container, const zval *offset, int type);

Where the container should represent the type on which the access is attempted (e.g. string, array)
The offset zval that is used, where the error message will display its type
The type of access, which should be a BP_VAR_* constant, to get special message for isset/empty/unset
2023-06-06 11:28:19 +01:00
Tim Starling
ab77485890 Improve test DOMAttr_entity_expansion.phpt 2023-06-05 20:15:49 +02:00
Tim Starling
0cc028c374 Changelog notes for DOMAttr value and nodeValue properties 2023-06-05 20:12:28 +02:00
Tim Starling
076ddf2b05 Also avoid entity expansion in DOMAttr::$nodeValue 2023-06-05 20:04:40 +02:00
Tim Starling
ee68c22128 Don't add 1 when calling xmlNodeSetContent()
The length is passed to xmlStrndup(), which also adds 1, and adds a null
terminator past the end. It worked because the length is not actually
stored. Strings in libxml2 are null terminated. Passing the length just
avoids a call to strlen().
2023-06-05 20:04:40 +02:00
Tim Starling
74910b1403 Factor out dom_remove_all_children()
A few callers remove all children of a node. The way it was done in
node.c was unsafe, because it left nodep->last dangling. It just happens
to not crash if xmlNodeSetContent() is called immediately afterwards.
2023-06-05 20:04:40 +02:00
Tim Starling
50fdad8325 Set DOMAttr::$value without expanding entities
The manual refers to the DOM Level 3 Core spec which says:

"On setting, this creates a Text node with the unparsed contents of the
string. I.e. any characters that an XML processor would recognize as
markup are instead treated as literal text."

PHP is expanding entities when DOMAttr::value is set, which is
non-compliant and is a difference in behaviour compared to browser DOM
implementations.

So, when value is set, remove all children of the attribute node. Then
create a single text node and insert that as the only child of the
attribute.

Add tests.
2023-06-05 20:04:40 +02:00
Niels Dossche
61e1f8aaeb Let closure created from magic method accept named parameters
Implements GH-11348.

Closes GH-11364.
2023-06-05 20:03:09 +02:00
David CARLIER
16a63d7b07 ext/pgsql: php_pgsql_convert converts E_NOTICE to TypeError/ValueError exceptions.
Close GH-11238
2023-06-05 15:31:39 +01:00
George Peter Banyard
9ce6980b4d Use known zend_string pointer to check for equality instead of C strings (#11370)
* Compare __invoke magic method name with known zend_string pointer

* Compare __sleep/__wakeup magic method name with known zend_string pointer
2023-06-05 13:59:04 +01:00
Niels Dossche
a720268214 Use uint32_t for the number of nodes (#11371) 2023-06-05 13:57:41 +01:00
Niels Dossche
e8fb0edc69 Merge branch 'PHP-8.2'
* PHP-8.2:
  Fix bug #77686: Removed elements are still returned by getElementById
  Fix bug #81642: DOMChildNode::replaceWith() bug when replacing a node with itself
  Fix bug #67440: append_node of a DOMDocumentFragment does not reconcile namespaces
2023-06-04 16:34:42 +02:00
Niels Dossche
5b79c53682 Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1:
  Fix bug #77686: Removed elements are still returned by getElementById
  Fix bug #81642: DOMChildNode::replaceWith() bug when replacing a node with itself
  Fix bug #67440: append_node of a DOMDocumentFragment does not reconcile namespaces
2023-06-04 16:27:03 +02:00
Niels Dossche
0e34ac864a Fix bug #77686: Removed elements are still returned by getElementById
From the moment an ID is created, libxml2's behaviour is to cache that element,
even if that element is not yet attached to the document. Similarly, only upon
destruction of the element the ID is actually removed by libxml2.
Since libxml2 has such behaviour deeply ingrained in the library, and uses the
cache for various purposes, it seems like a bad idea and lost cause to fight it.
Instead, we'll simply walk the tree upwards to check if the node is attached to
the document.

Closes GH-11369.
2023-06-04 16:20:34 +02:00
Niels Dossche
23f7002527 Fix bug #81642: DOMChildNode::replaceWith() bug when replacing a node with itself
Closes GH-11363.
2023-06-04 16:19:48 +02:00
Niels Dossche
b1d8e240e6 Fix bug #67440: append_node of a DOMDocumentFragment does not reconcile namespaces
The test was amended from the original issue report. For the test:
Co-authored-by: php@deep-freeze.ca

The problem is that the regular dom_reconcile_ns() only works on a
single node. We actually have to reconciliate the whole tree in case a
fragment was added. This also required to move some code around such
that this special case could be handled separately.

Closes GH-11362.
2023-06-04 16:19:04 +02:00
Niels Dossche
3da415662a Switch DOMNodeList::item() and DOMNamedNodeMap::item() to fast ZPP (#11361)
Code size impact:
* DOMNodeList::item() => +96 bytes hot, +31 bytes cold
* DOMNamedNodeMap::item() => +57 bytes hot, +31 bytes cold
2023-06-04 15:20:04 +02:00
Niels Dossche
ed097e30f0 No need for the double name pointer 2023-06-04 14:11:41 +01:00
Niels Dossche
47c277bde5 Use xmlStrEqual() instead of !xmlStrCmp()
This actually shows the intent clearer, and also from the docs of
xmlStrEqual:
"Should be a bit more readable and faster than xmlStrcmp()".
2023-06-04 14:11:41 +01:00
Niels Dossche
795127942b Remove double class entry variable 2023-06-04 14:11:41 +01:00
Niels Dossche
c6bffff96b Remove dead code from sxe_get_element_by_name()
retnode will never be set to anything other than NULL, because the
branch is always taken if the names match.
2023-06-04 14:11:41 +01:00
Niels Dossche
5fae4b5031 Struct-pack spl_dllist_object 2023-06-04 13:52:55 +01:00
Niels Dossche
c3f0797385 Implement iteration cache, item cache and length cache for node list iteration (#11330)
* Implement iteration cache, item cache and length cache for node list iteration

The current implementation follows the spec requirement that the list
must be "live". This means that changes in the document must be
reflected in the existing node lists without requiring the user to
refetch the node list.
The consequence is that getting any item, or the length of the list,
always starts searching from the root element of the node list. This
results in O(n) time to get any item or the length. If there's a for
loop over the node list, this means the iterations will take O(n²) time
in total. This causes real-world performance issues with potential for
downtime (see GH-11308 and its references for details).

We fix this by introducing a caching strategy. We cache the last
iterated object in the iterator, the last requested item in the node
list, and the last length computation. To invalidate the cache, we
simply count the number of modifications made to the containing
document. If the modification number does not match what the number was
during caching, we know the document has been modified and the cache is
invalid. If this ever overflows, we saturate the modification number and
don't do any caching anymore. Note that we don't check for overflow on
64-bit systems because it would take hundreds of years to overflow.

Fixes GH-11308.
2023-06-03 00:13:14 +02:00
George Peter Banyard
ce724d186d Assert zend_constant exist
If not the enum case does not exist and it is a programming error
2023-06-02 20:33:20 +01:00
George Peter Banyard
c5d7264149 Fix file descriptor check
Technically 0 is a valid file descriptor
2023-06-02 20:33:20 +01:00
George Peter Banyard
13ad8ef40b memory stream: fix [-Wanalyzer-deref-before-check]
|  732 |                 ts->mode = mode && mode[0] == 'r' && mode[1] != '+' ? TEMP_STREAM_READONLY : 0;
    |      |                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~

Although mode is already dereference on line 723 in the call to strlen()
2023-06-02 20:33:20 +01:00
George Peter Banyard
810507ab1b http_fopen_wrapper: fix [-Wanalyzer-deref-before-check]
warning: check of ‘*resource.scheme’ for NULL after already dereferencing it [-Wanalyzer-deref-before-check]
  186 |                 use_ssl = resource->scheme && (ZSTR_LEN(resource->scheme) > 4) && ZSTR_VAL(resource->scheme)[4] == 's';
      |                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Although resource->scheme is already dereferenced on line 163 in the IF condition
2023-06-02 20:33:20 +01:00
Pierrick Charron
79128afb92 [skip ci] Update release process to publish php-keyring.gpg in web-php 2023-06-02 15:13:37 -04:00
Niels Dossche
f8faa8b2ee Use zval_ptr_dtor_nogc() for callable in ext/xslt (#11356)
It cannot contain cycles because it's either a string or an array with 2 strings.
2023-06-02 11:58:00 +01:00
George Peter Banyard
15402454a6 ext/standard/array.c: Optimize min/max functions for int/float (#11194)
Co-authored-by: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
2023-06-02 10:27:46 +01:00
George Peter Banyard
82e761eaac Fix [-Wenum-int-mismatch] compiler warnings (#11352) 2023-06-01 13:27:46 +01:00
nielsdos
91fd5641cd Merge branch 'PHP-8.2'
* PHP-8.2:
  Fix GH-11347: Memory leak when calling a static method inside an xpath query
2023-05-31 17:19:18 +02:00
nielsdos
8126beac45 Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1:
  Fix GH-11347: Memory leak when calling a static method inside an xpath query
2023-05-31 17:17:10 +02:00
nielsdos
7812772105 Fix GH-11347: Memory leak when calling a static method inside an xpath query
It's a type confusion bug. `zend_make_callable` may change the function name
of the fci to become an array, causing a crash in debug mode on
`zval_ptr_dtor_str(&fci.function_name);` in `dom_xpath_ext_function_php`.
On a production build it doesn't crash but only causes a leak, because
the array elements are not destroyed, only the array container itself
is. We can use the nogc variant because it cannot contain cycles, the
potential array can only contain 2 strings.

Closes GH-11350.
2023-05-31 17:14:57 +02:00
Ilija Tovilo
bb48f5da1e Merge branch 'PHP-8.2'
* PHP-8.2:
  Fix bug GH-11246 cli/get_set_process_title
2023-05-31 17:10:44 +02:00
Ilija Tovilo
0bf8ecf9b3 Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1:
  Fix bug GH-11246 cli/get_set_process_title
2023-05-31 17:10:17 +02:00
James Lucas
c6ae7a55b7 Fix bug GH-11246 cli/get_set_process_title
Fail to clobber_error only when the argv is a non-contiguous area
Don't increment the end_of_error if a non-contiguous area is encountered in environ

Closes GH-11247
2023-05-31 17:08:37 +02:00
Alex Dowad
6930ef5837 Merge branch 'PHP-8.2'
* PHP-8.2:
  Fix mb_strlen is wrong length for CP932 when 0x80.
2023-05-30 14:02:16 -07:00
Alex Dowad
c33589ea11 Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1:
  Fix mb_strlen is wrong length for CP932 when 0x80.
2023-05-30 13:45:36 -07:00
Yuya Hamada
c50172e812 Fix mb_strlen is wrong length for CP932 when 0x80. 2023-05-30 13:44:30 -07:00
nielsdos
c6655fb719 Implement dom_get_doc_props_read_only()
I was surprised to see that getting the stricterror property showed in
in the Callgrind profile of some tests. Turns out we sometimes allocate
them. Fix this by returning the default in case no changes were made yet.

Closes GH-11345.
2023-05-30 17:48:29 +02:00
nielsdos
d8102e6ba4 Remove unnecessary tree setting in dom_zvals_to_fragment()
This is already done by xmlNewDocText().

Closes GH-11345.
2023-05-30 17:48:12 +02:00
nielsdos
1ed68686de Merge branch 'PHP-8.2'
* PHP-8.2:
  Fix DOMElement::append() and DOMElement::prepend() hierarchy checks
  Fix spec compliance error for DOMDocument::getElementsByTagNameNS
  Fix GH-11336: php still tries to unlock the shared memory ZendSem with opcache.file_cache_only=1 but it was never locked
  Fix GH-11338: SplFileInfo empty getBasename with more than one slash
2023-05-30 17:41:54 +02:00
nielsdos
0e7ad40900 Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1:
  Fix DOMElement::append() and DOMElement::prepend() hierarchy checks
  Fix spec compliance error for DOMDocument::getElementsByTagNameNS
  Fix GH-11336: php still tries to unlock the shared memory ZendSem with opcache.file_cache_only=1 but it was never locked
  Fix GH-11338: SplFileInfo empty getBasename with more than one slash
2023-05-30 17:38:18 +02:00
nielsdos
b374ec399d Fix DOMElement::append() and DOMElement::prepend() hierarchy checks
We could end up in an invalid hierarchy, resulting in infinite loops and
eventual crashes if we don't check for the DOM hierarchy validity.

Closes GH-11344.
2023-05-30 17:36:26 +02:00