@@ -183,15 +183,7 @@ xmlNode* dom_zvals_to_fragment(php_libxml_ref_obj *document, xmlNode *contextNod
183183 goto err ;
184184 }
185185
186- if (newNode -> type == XML_DOCUMENT_FRAG_NODE ) {
187- /* Unpack document fragment nodes, the behaviour differs for different libxml2 versions. */
188- newNode = newNode -> children ;
189- if (UNEXPECTED (newNode == NULL )) {
190- /* No nodes to add, nothing to do here */
191- continue ;
192- }
193- xmlUnlinkNode (newNode );
194- } else if (newNode -> parent != NULL ) {
186+ if (newNode -> parent != NULL ) {
195187 xmlUnlinkNode (newNode );
196188 }
197189
@@ -210,14 +202,23 @@ xmlNode* dom_zvals_to_fragment(php_libxml_ref_obj *document, xmlNode *contextNod
210202 newNode = xmlCopyNode (newNode , 1 );
211203 }
212204
213- if (!xmlAddChild (fragment , newNode )) {
205+ if (newNode -> type == XML_DOCUMENT_FRAG_NODE ) {
206+ /* Unpack document fragment nodes, the behaviour differs for different libxml2 versions. */
207+ newNode = newNode -> children ;
208+ while (newNode ) {
209+ xmlNodePtr next = newNode -> next ;
210+ xmlUnlinkNode (newNode );
211+ if (!xmlAddChild (fragment , newNode )) {
212+ goto hierarchy_request_err ;
213+ }
214+ newNode = next ;
215+ }
216+ } else if (!xmlAddChild (fragment , newNode )) {
214217 if (will_free ) {
215218 xmlFreeNode (newNode );
216219 }
217220 goto hierarchy_request_err ;
218221 }
219-
220- continue ;
221222 } else {
222223 zend_argument_type_error (i + 1 , "must be of type DOMNode|string, %s given" , zend_zval_type_name (& nodes [i ]));
223224 goto err ;
@@ -363,14 +364,13 @@ static void dom_pre_insert(xmlNodePtr insertion_point, xmlNodePtr parentNode, xm
363364 /* Place it as last node */
364365 if (parentNode -> children ) {
365366 /* There are children */
366- fragment -> last -> prev = parentNode -> last ;
367- newchild -> prev = parentNode -> last -> prev ;
367+ newchild -> prev = parentNode -> last ;
368368 parentNode -> last -> next = newchild ;
369369 } else {
370370 /* No children, because they moved out when they became a fragment */
371371 parentNode -> children = newchild ;
372- parentNode -> last = newchild ;
373372 }
373+ parentNode -> last = fragment -> last ;
374374 } else {
375375 /* Insert fragment before insertion_point */
376376 fragment -> last -> next = insertion_point ;
0 commit comments