From 904207c40cf2505b57f2167ef5d2efdcb8e8dc9a Mon Sep 17 00:00:00 2001 From: lacatoire Date: Tue, 13 Oct 2026 15:31:27 +0200 Subject: [PATCH] Clear the libxml last error in libxml_use_internal_errors(false) libxml_use_internal_errors(false) destroyed the internal error list but left libxml's own last error in place. libxml_get_last_error() falls back to it once the list is gone, so it kept returning an error while libxml_get_errors() was empty, although the documentation says that disabling clears the existing errors. Reset the last error when the list is destroyed. Calling the function again while the internal errors are already disabled leaves it alone. --- ext/libxml/libxml.c | 3 ++ ...use_internal_errors_clears_last_error.phpt | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 ext/libxml/tests/libxml_use_internal_errors_clears_last_error.phpt diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c index e53746379428..489dea577105 100644 --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -1137,6 +1137,9 @@ PHP_FUNCTION(libxml_use_internal_errors) zend_llist_destroy(LIBXML(error_list)); efree(LIBXML(error_list)); LIBXML(error_list) = NULL; + /* libxml_get_last_error() falls back to libxml's own last error + * once the list is gone, so it must not outlive the cleared list. */ + xmlResetLastError(); } } else { xmlSetStructuredErrorFunc(NULL, php_libxml_structured_error_handler); diff --git a/ext/libxml/tests/libxml_use_internal_errors_clears_last_error.phpt b/ext/libxml/tests/libxml_use_internal_errors_clears_last_error.phpt new file mode 100644 index 000000000000..a0a40d100a63 --- /dev/null +++ b/ext/libxml/tests/libxml_use_internal_errors_clears_last_error.phpt @@ -0,0 +1,29 @@ +--TEST-- +libxml_use_internal_errors(false) clears the last error +--EXTENSIONS-- +libxml +dom +--FILE-- +loadXML(''); + +var_dump(count(libxml_get_errors()) > 0); +var_dump(libxml_get_last_error() instanceof LibXMLError); + +var_dump(libxml_use_internal_errors(false)); + +var_dump(libxml_get_errors()); +var_dump(libxml_get_last_error()); + +?> +--EXPECT-- +bool(true) +bool(true) +bool(true) +array(0) { +} +bool(false)