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) ""