@@ -147,7 +147,7 @@ static HashTable dom_xpath_prop_handlers;
147147
148148static zend_object * dom_objects_namespace_node_new (zend_class_entry * class_type );
149149static void dom_object_namespace_node_free_storage (zend_object * object );
150- static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original );
150+ static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original , xmlDocPtr fallback_doc );
151151
152152typedef zend_result (* dom_read_t )(dom_object * obj , zval * retval );
153153typedef zend_result (* dom_write_t )(dom_object * obj , zval * newval );
@@ -722,7 +722,8 @@ static zend_object *dom_object_namespace_node_clone_obj(zend_object *zobject)
722722 xmlNodePtr original_node = dom_object_get_node (& intern -> dom );
723723 if (original_node != NULL ) {
724724 ZEND_ASSERT (original_node -> type == XML_NAMESPACE_DECL );
725- xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr (original_node -> parent , original_node -> ns );
725+ xmlNodePtr parent = intern -> parent_intern ? dom_object_get_node (intern -> parent_intern ) : NULL ;
726+ xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr (parent , original_node -> ns , original_node -> doc );
726727 dom_update_refcount_after_clone (& intern -> dom , original_node , & clone_intern -> dom , cloned_node );
727728 }
728729
@@ -2255,15 +2256,16 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
22552256}
22562257/* }}} end dom_get_nsdecl */
22572258
2258- static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original )
2259+ static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original , xmlDocPtr fallback_doc )
22592260{
22602261 xmlNodePtr attrp ;
2262+ xmlDocPtr doc = nodep ? nodep -> doc : fallback_doc ;
22612263 xmlNsPtr curns = xmlNewNs (NULL , original -> href , NULL );
22622264 if (original -> prefix ) {
22632265 curns -> prefix = xmlStrdup (original -> prefix );
2264- attrp = xmlNewDocNode (nodep -> doc , NULL , BAD_CAST original -> prefix , original -> href );
2266+ attrp = xmlNewDocNode (doc , NULL , BAD_CAST original -> prefix , original -> href );
22652267 } else {
2266- attrp = xmlNewDocNode (nodep -> doc , NULL , BAD_CAST "xmlns" , original -> href );
2268+ attrp = xmlNewDocNode (doc , NULL , BAD_CAST "xmlns" , original -> href );
22672269 }
22682270 attrp -> type = XML_NAMESPACE_DECL ;
22692271 attrp -> parent = nodep ;
@@ -2274,7 +2276,7 @@ static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr(xmlNodePtr nodep,
22742276/* Note: Assumes the additional lifetime was already added in the caller. */
22752277xmlNodePtr php_dom_create_fake_namespace_decl (xmlNodePtr nodep , xmlNsPtr original , zval * return_value , dom_object * parent_intern )
22762278{
2277- xmlNodePtr attrp = php_dom_create_fake_namespace_decl_node_ptr (nodep , original );
2279+ xmlNodePtr attrp = php_dom_create_fake_namespace_decl_node_ptr (nodep , original , NULL );
22782280 php_dom_create_object (attrp , return_value , parent_intern );
22792281 /* This object must exist, because we just created an object for it via php_dom_create_object(). */
22802282 php_dom_namespace_node_obj_from_obj (Z_OBJ_P (return_value ))-> parent_intern = parent_intern ;
0 commit comments