Skip to content

Commit 0b7a0e9

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Restore old namespace reconciliation behaviour
2 parents 21d9fd3 + 6a2b885 commit 0b7a0e9

File tree

8 files changed

+55
-14
lines changed

8 files changed

+55
-14
lines changed

ext/dom/php_dom.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1465,11 +1465,16 @@ static void dom_reconcile_ns_internal(xmlDocPtr doc, xmlNodePtr nodep, xmlNodePt
14651465

14661466
static void dom_libxml_reconcile_ensure_namespaces_are_declared(xmlNodePtr nodep)
14671467
{
1468+
/* Ideally we'd use the DOM-wrapped version, but we cannot: https://github.com/php/php-src/pull/12308. */
1469+
#if 0
14681470
/* Put on stack to avoid allocation.
14691471
* Although libxml2 currently does not use this for the reconciliation, it still
14701472
* makes sense to do this just in case libxml2's internal change in the future. */
14711473
xmlDOMWrapCtxt dummy_ctxt = {0};
14721474
xmlDOMWrapReconcileNamespaces(&dummy_ctxt, nodep, /* options */ 0);
1475+
#else
1476+
xmlReconciliateNs(nodep->doc, nodep);
1477+
#endif
14731478
}
14741479

14751480
void dom_reconcile_ns(xmlDocPtr doc, xmlNodePtr nodep) /* {{{ */

ext/dom/tests/DOMElement_toggleAttribute.phpt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,26 +123,26 @@ bool(true)
123123
Toggling namespaces:
124124
bool(false)
125125
<?xml version="1.0"?>
126-
<container xmlns:foo="some:ns2" xmlns:anotherone="some:ns3" xmlns="some:ns"><foo:bar/><baz/></container>
126+
<default:container xmlns:foo="some:ns2" xmlns:anotherone="some:ns3" xmlns:default="some:ns"><foo:bar/><default:baz/></default:container>
127127
bool(false)
128128
<?xml version="1.0"?>
129-
<container xmlns:foo="some:ns2" xmlns="some:ns"><foo:bar/><baz/></container>
129+
<default:container xmlns:foo="some:ns2" xmlns:default="some:ns"><foo:bar/><default:baz/></default:container>
130130
bool(true)
131131
<?xml version="1.0"?>
132-
<container xmlns:foo="some:ns2" xmlns="some:ns" xmlns:anotherone=""><foo:bar/><baz/></container>
132+
<default:container xmlns:foo="some:ns2" xmlns:default="some:ns" xmlns:anotherone=""><foo:bar/><default:baz/></default:container>
133133
bool(false)
134134
<?xml version="1.0"?>
135-
<container xmlns="some:ns" xmlns:anotherone=""><foo:bar xmlns:foo="some:ns2"/><baz/></container>
135+
<default:container xmlns:default="some:ns" xmlns:anotherone="" xmlns:foo="some:ns2"><foo:bar/><default:baz/></default:container>
136136
bool(false)
137137
<?xml version="1.0"?>
138-
<container xmlns="some:ns" xmlns:anotherone=""><foo:bar xmlns:foo="some:ns2"/><baz/></container>
138+
<default:container xmlns:default="some:ns" xmlns:anotherone="" xmlns:foo="some:ns2"><foo:bar/><default:baz/></default:container>
139139
Toggling namespaced attributes:
140140
bool(true)
141141
bool(true)
142142
bool(true)
143143
bool(false)
144144
<?xml version="1.0"?>
145-
<container xmlns="some:ns" xmlns:anotherone="" test:test=""><foo:bar xmlns:foo="some:ns2" foo:test="" doesnotexist:test=""/><baz/></container>
145+
<default:container xmlns:default="some:ns" xmlns:anotherone="" xmlns:foo="some:ns2" test:test=""><foo:bar foo:test="" doesnotexist:test=""/><default:baz/></default:container>
146146
namespace of test:test = NULL
147147
namespace of foo:test = string(8) "some:ns2"
148148
namespace of doesnotexist:test = NULL
@@ -153,6 +153,6 @@ bool(false)
153153
bool(true)
154154
bool(false)
155155
<?xml version="1.0"?>
156-
<container xmlns="some:ns" xmlns:anotherone=""><foo:bar xmlns:foo="some:ns2" doesnotexist:test2=""/><baz/></container>
156+
<default:container xmlns:default="some:ns" xmlns:anotherone="" xmlns:foo="some:ns2"><foo:bar doesnotexist:test2=""/><default:baz/></default:container>
157157
Checking toggled namespace:
158158
string(0) ""

ext/dom/tests/bug47530.phpt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,18 +118,18 @@ test_appendChild_with_shadowing();
118118
--EXPECT--
119119
-- Test document fragment with import --
120120
<?xml version="1.0"?>
121-
<html xmlns="https://php.net/something" xmlns:ns="https://php.net/whatever"><element ns:foo="https://php.net/bar"/></html>
121+
<html xmlns="https://php.net/something" xmlns:ns="https://php.net/whatever"><default:element xmlns:default="https://php.net/something" ns:foo="https://php.net/bar"/></html>
122122
-- Test document fragment without import --
123123
<?xml version="1.0"?>
124-
<html xmlns=""><element xmlns:foo="https://php.net/bar"><foo:bar/><bar xmlns=""/></element></html>
124+
<html xmlns=""><element xmlns:foo="https://php.net/bar"><foo:bar/><bar/></element></html>
125125
string(7) "foo:bar"
126126
string(19) "https://php.net/bar"
127127
-- Test document import --
128128
<?xml version="1.0"?>
129-
<feed xmlns="http://www.w3.org/2005/Atom">
130-
<div xmlns="http://www.w3.org/1999/xhtml">
131-
<p>Test-Text</p>
132-
</div>
129+
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
130+
<default:div xmlns="http://www.w3.org/1999/xhtml">
131+
<default:p>Test-Text</default:p>
132+
</default:div>
133133
</feed>
134134
-- Test partial document import --
135135
<?xml version="1.0"?>

ext/dom/tests/bug47847.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Bug #47847 (importNode loses the namespace of an XML element)
33
--EXTENSIONS--
44
dom
5+
--XFAIL--
6+
See https://github.com/php/php-src/pull/12308
57
--FILE--
68
<?php
79
$fromdom = new DOMDocument();

ext/dom/tests/bug55294.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Bug #55294 (DOMDocument::importNode shifts namespaces when "default" namespace exists)
33
--EXTENSIONS--
44
dom
5+
--XFAIL--
6+
See https://github.com/php/php-src/pull/12308
57
--FILE--
68
<?php
79

ext/dom/tests/delayed_freeing/gh9628_1.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,6 @@ string(7) "some:ns"
4343
<span xmlns:test="some:ns2" xmlns="some:ns" id="1">
4444

4545
</span>
46-
<span xmlns="some:ns" id="2">Test <test:test xmlns:test="some:ns2"/></span>
46+
<default:span xmlns:default="some:ns" xmlns:test="some:ns2" id="2">Test <test:test/></default:span>
4747
string(1) "2"
4848
string(7) "some:ns"
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
DOM: specific namespace behaviour for applications with fixed serialization requirements
3+
--EXTENSIONS--
4+
dom
5+
--FILE--
6+
<?php
7+
8+
$dom1 = new DOMDocument();
9+
$dom1->loadXML(<<<XML
10+
<wsse:Security xmlns:wsse="foo:bar">
11+
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
12+
</ds:Signature>
13+
</wsse:Security>
14+
XML);
15+
$dom2 = new DOMDocument();
16+
$dom2->loadXML('<xml><child/></xml>');
17+
$wsse = $dom2->importNode($dom1->documentElement, true);
18+
$dom2->firstChild->firstChild->appendChild($wsse);
19+
echo $dom2->saveXML();
20+
21+
?>
22+
--EXPECT--
23+
<?xml version="1.0"?>
24+
<xml><child><wsse:Security xmlns:wsse="foo:bar" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
25+
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
26+
</ds:Signature>
27+
</wsse:Security></child></xml>

ext/libxml/libxml.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,13 @@ PHP_LIBXML_API void php_libxml_node_free_list(xmlNodePtr node)
301301
if (curnode->type == XML_ELEMENT_NODE) {
302302
/* This ensures that namespace references in this subtree are defined within this subtree,
303303
* otherwise a use-after-free would be possible when the original namespace holder gets freed. */
304+
#if 0
304305
xmlDOMWrapCtxt dummy_ctxt = {0};
305306
xmlDOMWrapReconcileNamespaces(&dummy_ctxt, curnode, /* options */ 0);
307+
#else
308+
/* See php_dom.c */
309+
xmlReconciliateNs(curnode->doc, curnode);
310+
#endif
306311
}
307312
/* Skip freeing */
308313
curnode = next;

0 commit comments

Comments
 (0)