Commit 19f73c57125 for php.net
commit 19f73c571254ff1bc107eaedbe5197fcd34ebbfc
Author: David Carlier <devnexen@gmail.com>
Date: Thu Apr 9 18:17:38 2026 +0100
Fix GH-21688: SEGV in C14N on empty HTMLDocument.
close GH-21693
diff --git a/NEWS b/NEWS
index fcdfd3973d8..2071326cf6e 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,8 @@ PHP NEWS
- DOM:
. Fixed bug GH-21566 (Dom\XMLDocument::C14N() emits duplicate xmlns
declarations after setAttributeNS()). (David Carlier)
+ . Fixed bug GH-21688 (segmentation fault on empty HTMLDocument).
+ (David Carlier)
- Iconv:
. Fixed bug GH-17399 (iconv memory leak on bailout). (iliaal)
diff --git a/ext/dom/node.c b/ext/dom/node.c
index 83404d0f598..bbe8311147f 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -2263,7 +2263,11 @@ static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{
}
zend_hash_init(&links, 0, NULL, NULL, false);
- dom_relink_ns_decls(&links, xmlDocGetRootElement(docp));
+ xmlNodePtr root_element = xmlDocGetRootElement(docp);
+
+ if (root_element) {
+ dom_relink_ns_decls(&links, root_element);
+ }
} else if (!docp) {
/* Note: not triggerable with modern DOM */
zend_throw_error(NULL, "Node must be associated with a document");
diff --git a/ext/dom/tests/modern/html/gh21688.phpt b/ext/dom/tests/modern/html/gh21688.phpt
new file mode 100644
index 00000000000..ddfb4d326c6
--- /dev/null
+++ b/ext/dom/tests/modern/html/gh21688.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-21688 (SEGV in C14N on empty HTMLDocument)
+--CREDITS--
+YuanchengJiang
+--EXTENSIONS--
+dom
+--FILE--
+<?php
+$dom = Dom\HTMLDocument::createEmpty();
+var_dump($dom->C14N());
+?>
+--EXPECT--
+string(0) ""