Commit c36758eefbc for php.net

commit c36758eefbc681c2e3c4f64c346b48c1edac85c3
Author: Shivam Mathur <shivam_jpr@hotmail.com>
Date:   Sun Sep 13 17:59:47 2026 +0000

    Avoid closing libxml output encoder twice (#23678)

diff --git a/ext/dom/tests/DOMDocument_saveHTMLFile_failed_output_encoding.phpt b/ext/dom/tests/DOMDocument_saveHTMLFile_failed_output_encoding.phpt
new file mode 100644
index 00000000000..05adefb973a
--- /dev/null
+++ b/ext/dom/tests/DOMDocument_saveHTMLFile_failed_output_encoding.phpt
@@ -0,0 +1,31 @@
+--TEST--
+DOMDocument::saveHTMLFile() does not close the encoder twice when opening the output fails
+--EXTENSIONS--
+dom
+--FILE--
+<?php
+$filename = __DIR__ . '/missing-saveHTMLFile-directory/output.html';
+foreach (['UTF-8', 'ISO-8859-1', 'UTF-16'] as $encoding) {
+    $doc = new DOMDocument();
+    $doc->loadHTML('<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>value</body></html>');
+    $doc->getElementsByTagName('meta')->item(0)->setAttribute('content', 'text/html; charset=' . $encoding);
+    for ($i = 0; $i < 3; $i++) {
+        $result = @$doc->saveHTMLFile($filename);
+        var_dump($result === 0 || $result === false);
+    }
+    var_dump($doc->getElementsByTagName('body')->item(0)->textContent === 'value');
+}
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
index fa943244436..c73bcf930cf 100644
--- a/ext/libxml/libxml.c
+++ b/ext/libxml/libxml.c
@@ -618,8 +618,10 @@ php_libxml_output_buffer_create_filename(const char *URI,
 	return(ret);

 err:
-	/* Similarly to __xmlOutputBufferCreateFilename we should also close the encoder on failure. */
+#if LIBXML_VERSION < 21404
+	/* As of libxml 2.14.4, libxml closes the encoder after this callback fails. */
 	xmlCharEncCloseFunc(encoder);
+#endif
 	return NULL;
 }