Commit 685bd9de813 for php.net

commit 685bd9de813a588e0536a7934cad915b2eeeb77f
Merge: c343ede18de 26b9395ad6b
Author: Ilija Tovilo <ilija.tovilo@me.com>
Date:   Tue Dec 2 16:41:37 2025 +0100

    Merge branch 'PHP-8.2' into PHP-8.3

    * PHP-8.2:
      Suppress libxml deprecations

diff --cc ext/dom/document.c
index faf6e210e2d,0bdd8262dcc..252e9ddd4e0
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@@ -1538,11 -1439,13 +1538,13 @@@ PHP_METHOD(DOMDocument, save

  	/* encoding handled by property on doc */

 -	doc_props = dom_get_doc_props(intern->document);
 +	libxml_doc_props const* doc_props = dom_get_doc_props_read_only(intern->document);
  	format = doc_props->formatoutput;
  	if (options & LIBXML_SAVE_NOEMPTYTAG) {
+ 		ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
  		saveempty = xmlSaveNoEmptyTags;
  		xmlSaveNoEmptyTags = 1;
+ 		ZEND_DIAGNOSTIC_IGNORED_END
  	}
  	bytes = xmlSaveFormatFileEnc(file, docp, NULL, format);
  	if (options & LIBXML_SAVE_NOEMPTYTAG) {
@@@ -1592,55 -1497,88 +1596,63 @@@ PHP_METHOD(DOMDocument, saveXML
  			php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
  			RETURN_FALSE;
  		}
 -		if (options & LIBXML_SAVE_NOEMPTYTAG) {
 -			ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 -			saveempty = xmlSaveNoEmptyTags;
 -			xmlSaveNoEmptyTags = 1;
 -			ZEND_DIAGNOSTIC_IGNORED_END
 -		}
 +		/* Save libxml2 global, override its vaule, and restore after saving. */
++		ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 +		old_xml_save_no_empty_tags = xmlSaveNoEmptyTags;
 +		xmlSaveNoEmptyTags = (options & LIBXML_SAVE_NOEMPTYTAG) ? 1 : 0;
++		ZEND_DIAGNOSTIC_IGNORED_END
  		xmlNodeDump(buf, docp, node, 0, format);
 -		if (options & LIBXML_SAVE_NOEMPTYTAG) {
 -			ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 -			xmlSaveNoEmptyTags = saveempty;
 -			ZEND_DIAGNOSTIC_IGNORED_END
 -		}
 -		mem = (xmlChar*) xmlBufferContent(buf);
 -		if (!mem) {
 -			xmlBufferFree(buf);
++		ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 +		xmlSaveNoEmptyTags = old_xml_save_no_empty_tags;
++		ZEND_DIAGNOSTIC_IGNORED_END
 +	} else {
 +		buf = xmlBufferCreate();
 +		if (!buf) {
 +			php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
  			RETURN_FALSE;
  		}
 -		RETVAL_STRING((char *) mem);
 -		xmlBufferFree(buf);
 -	} else {
 -		if (options & LIBXML_SAVE_NOEMPTYTAG) {
 -			ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 -			saveempty = xmlSaveNoEmptyTags;
 -			xmlSaveNoEmptyTags = 1;
 -			ZEND_DIAGNOSTIC_IGNORED_END
 +
 +		int converted_options = XML_SAVE_AS_XML;
 +		if (options & XML_SAVE_NO_DECL) {
 +			converted_options |= XML_SAVE_NO_DECL;
  		}
 +		if (format) {
 +			converted_options |= XML_SAVE_FORMAT;
 +		}
 +		/* Save libxml2 global, override its vaule, and restore after saving. */
++		ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 +		old_xml_save_no_empty_tags = xmlSaveNoEmptyTags;
 +		xmlSaveNoEmptyTags = (options & LIBXML_SAVE_NOEMPTYTAG) ? 1 : 0;
++		ZEND_DIAGNOSTIC_IGNORED_END
  		/* Encoding is handled from the encoding property set on the document */
 -		xmlDocDumpFormatMemory(docp, &mem, &size, format);
 -		if (options & LIBXML_SAVE_NOEMPTYTAG) {
 -			ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 -			xmlSaveNoEmptyTags = saveempty;
 -			ZEND_DIAGNOSTIC_IGNORED_END
 +		xmlSaveCtxtPtr ctxt = xmlSaveToBuffer(buf, (const char *) docp->encoding, converted_options);
++		ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
 +		xmlSaveNoEmptyTags = old_xml_save_no_empty_tags;
++		ZEND_DIAGNOSTIC_IGNORED_END
 +		if (UNEXPECTED(!ctxt)) {
 +			xmlBufferFree(buf);
 +			php_error_docref(NULL, E_WARNING, "Could not create save context");
 +			RETURN_FALSE;
  		}
 -		if (!size || !mem) {
 +		if (UNEXPECTED(xmlSaveDoc(ctxt, docp) < 0)) {
 +			(void) xmlSaveClose(ctxt);
 +			xmlBufferFree(buf);
 +			php_error_docref(NULL, E_WARNING, "Could not save document");
  			RETURN_FALSE;
  		}
 -		RETVAL_STRINGL((char *) mem, size);
 -		xmlFree(mem);
 +		(void) xmlSaveFlush(ctxt);
 +		(void) xmlSaveClose(ctxt);
  	}
 -}
 -/* }}} end dom_document_savexml */
 -
 -static xmlNodePtr php_dom_free_xinclude_node(xmlNodePtr cur) /* {{{ */
 -{
 -	xmlNodePtr xincnode;
 -
 -	xincnode = cur;
 -	cur = cur->next;
 -	xmlUnlinkNode(xincnode);
 -	php_libxml_node_free_resource(xincnode);
 -
 -	return cur;
 -}
 -/* }}} */
 -
 -static void php_dom_remove_xinclude_nodes(xmlNodePtr cur) /* {{{ */
 -{
 -	while(cur) {
 -		if (cur->type == XML_XINCLUDE_START) {
 -			cur = php_dom_free_xinclude_node(cur);
 -
 -			/* XML_XINCLUDE_END node will be a sibling of XML_XINCLUDE_START */
 -			while(cur && cur->type != XML_XINCLUDE_END) {
 -				/* remove xinclude processing nodes from recursive xincludes */
 -				if (cur->type == XML_ELEMENT_NODE) {
 -					   php_dom_remove_xinclude_nodes(cur->children);
 -				}
 -				cur = cur->next;
 -			}
 -
 -			if (cur && cur->type == XML_XINCLUDE_END) {
 -				cur = php_dom_free_xinclude_node(cur);
 -			}
 -		} else {
 -			if (cur->type == XML_ELEMENT_NODE) {
 -				php_dom_remove_xinclude_nodes(cur->children);
 -			}
 -			cur = cur->next;
 -		}
 +	mem = xmlBufferContent(buf);
 +	if (!mem) {
 +		xmlBufferFree(buf);
 +		RETURN_FALSE;
  	}
 +	size = xmlBufferLength(buf);
 +	RETVAL_STRINGL((const char *) mem, size);
 +	xmlBufferFree(buf);
  }
 -/* }}} */
 +/* }}} end dom_document_savexml */

  /* Backported from master branch xml_common.h */
  static zend_always_inline xmlNodePtr php_dom_next_in_tree_order(const xmlNode *nodep, const xmlNode *basep)