https://github.com/php/php-src/issues/12965 Build Failure With libxml2-2.12.3 #12965 https://github.com/php/php-src/commit/0a39890 Fix libxml2 2.12 build due to API breaks https://github.com/php/php-src/commit/8a95e61 Fix GH-12702: libxml2 2.12.0 issue building from src /ext/xml/compat.c:569:35: warning: 'lastError' is deprecated [-Wdeprecated-declarations] /opt/local/include/libxml2/libxml/parser.h:597:24: note: 'lastError' has been explicitly marked deprecated here return !error && parser->parser->lastError.level <= XML_ERR_WARNING; backporting from php81 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -25,6 +25,7 @@ #if HAVE_LIBXML && HAVE_DOM #include "php_dom.h" #include +#include #ifdef LIBXML_SCHEMAS_ENABLED #include #include --- a/ext/libxml/php_libxml.h +++ b/ext/libxml/php_libxml.h @@ -37,6 +37,7 @@ extern zend_module_entry libxml_module_entry; #include "zend_smart_str.h" #include +#include #define LIBXML_SAVE_NOEMPTYTAG 1<<2 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -333,7 +333,7 @@ static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include) sdl_restore_uri_credentials(ctx); if (!wsdl) { - xmlErrorPtr xmlErrorPtr = xmlGetLastError(); + const xmlError *xmlErrorPtr = xmlGetLastError(); if (xmlErrorPtr) { soap_error2(E_ERROR, "Parsing WSDL: Couldn't load from '%s' : %s", struri, xmlErrorPtr->message); --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -476,7 +476,7 @@ php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc) static xmlOutputBufferPtr php_libxml_output_buffer_create_filename(const char *URI, xmlCharEncodingHandlerPtr encoder, - int compression ATTRIBUTE_UNUSED) + int compression __attribute__((__unused__))) { xmlOutputBufferPtr ret; xmlURIPtr puri; --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -530,7 +530,11 @@ static int _php_libxml_free_error(xmlErrorPtr error) return 1; } -static void _php_list_set_error_structure(xmlErrorPtr error, const char *msg) +#if LIBXML_VERSION >= 21200 +static void _php_list_set_error_structure(const xmlError *error, const char *msg) +#else +static void _php_list_set_error_structure(xmlError *error, const char *msg) +#endif { xmlError error_copy; int ret; @@ -782,7 +786,11 @@ PHP_LIBXML_API void php_libxml_ctx_warning(void *ctx, const char *msg, ...) va_end(args); } +#if LIBXML_VERSION >= 21200 +PHP_LIBXML_API void php_libxml_structured_error_handler(void *userData, const xmlError *error) +#else PHP_LIBXML_API void php_libxml_structured_error_handler(void *userData, xmlErrorPtr error) +#endif { _php_list_set_error_structure(error, NULL); --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -1069,9 +1069,7 @@ static PHP_FUNCTION(libxml_use_internal_errors) Retrieve last error from libxml */ static PHP_FUNCTION(libxml_get_last_error) { - xmlErrorPtr error; - - error = xmlGetLastError(); + const xmlError *error = xmlGetLastError(); if (error) { object_init_ex(return_value, libxmlerror_class_entry); --- a/ext/xml/compat.c 2026-04-10 10:23:52 +++ b/ext/xml/compat.c 2026-04-10 10:19:04 @@ -563,10 +563,14 @@ PHP_XML_API int XML_Parse(XML_Parser parser, const XML_Char *data, int data_len, int is_final) { - int error; + int error = xmlParseChunk(parser->parser, (char *) data, data_len, is_final); - error = xmlParseChunk(parser->parser, (char *) data, data_len, is_final); - return !error && parser->parser->lastError.level <= XML_ERR_WARNING; + if (!error) { + const xmlError *error_data = xmlCtxtGetLastError(parser->parser); + return !error_data || error_data->level <= XML_ERR_WARNING; + } + + return 0; } PHP_XML_API int