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)