@@ -146,7 +146,7 @@ static HashTable dom_xpath_prop_handlers;
146146
147147static zend_object * dom_objects_namespace_node_new (zend_class_entry * class_type );
148148static void dom_object_namespace_node_free_storage (zend_object * object );
149- static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original );
149+ static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original , xmlDocPtr fallback_doc );
150150
151151typedef zend_result (* dom_read_t )(dom_object * obj , zval * retval );
152152typedef zend_result (* dom_write_t )(dom_object * obj , zval * newval );
@@ -705,7 +705,8 @@ static zend_object *dom_object_namespace_node_clone_obj(zend_object *zobject)
705705 xmlNodePtr original_node = dom_object_get_node (& intern -> dom );
706706 if (original_node != NULL ) {
707707 ZEND_ASSERT (original_node -> type == XML_NAMESPACE_DECL );
708- xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr (original_node -> parent , original_node -> ns );
708+ xmlNodePtr parent = intern -> parent_intern ? dom_object_get_node (intern -> parent_intern ) : NULL ;
709+ xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr (parent , original_node -> ns , original_node -> doc );
709710 dom_update_refcount_after_clone (& intern -> dom , original_node , & clone_intern -> dom , cloned_node );
710711 }
711712
@@ -2318,15 +2319,16 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
23182319}
23192320/* }}} end dom_get_nsdecl */
23202321
2321- static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original )
2322+ static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr (xmlNodePtr nodep , xmlNsPtr original , xmlDocPtr fallback_doc )
23222323{
23232324 xmlNodePtr attrp ;
2325+ xmlDocPtr doc = nodep ? nodep -> doc : fallback_doc ;
23242326 xmlNsPtr curns = xmlNewNs (NULL , original -> href , NULL );
23252327 if (original -> prefix ) {
23262328 curns -> prefix = xmlStrdup (original -> prefix );
2327- attrp = xmlNewDocNode (nodep -> doc , NULL , BAD_CAST original -> prefix , original -> href );
2329+ attrp = xmlNewDocNode (doc , NULL , BAD_CAST original -> prefix , original -> href );
23282330 } else {
2329- attrp = xmlNewDocNode (nodep -> doc , NULL , BAD_CAST "xmlns" , original -> href );
2331+ attrp = xmlNewDocNode (doc , NULL , BAD_CAST "xmlns" , original -> href );
23302332 }
23312333 attrp -> type = XML_NAMESPACE_DECL ;
23322334 attrp -> parent = nodep ;
@@ -2337,7 +2339,7 @@ static xmlNodePtr php_dom_create_fake_namespace_decl_node_ptr(xmlNodePtr nodep,
23372339/* Note: Assumes the additional lifetime was already added in the caller. */
23382340xmlNodePtr php_dom_create_fake_namespace_decl (xmlNodePtr nodep , xmlNsPtr original , zval * return_value , dom_object * parent_intern )
23392341{
2340- xmlNodePtr attrp = php_dom_create_fake_namespace_decl_node_ptr (nodep , original );
2342+ xmlNodePtr attrp = php_dom_create_fake_namespace_decl_node_ptr (nodep , original , NULL );
23412343 php_dom_create_object (attrp , return_value , parent_intern );
23422344 /* This object must exist, because we just created an object for it via php_dom_create_object(). */
23432345 php_dom_namespace_node_obj_from_obj (Z_OBJ_P (return_value ))-> parent_intern = parent_intern ;
0 commit comments