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;
}