@@ -182,15 +182,7 @@ xmlNode* dom_zvals_to_fragment(php_libxml_ref_obj *document, xmlNode *contextNod
182
182
goto err ;
183
183
}
184
184
185
- if (newNode -> type == XML_DOCUMENT_FRAG_NODE ) {
186
- /* Unpack document fragment nodes, the behaviour differs for different libxml2 versions. */
187
- newNode = newNode -> children ;
188
- if (UNEXPECTED (newNode == NULL )) {
189
- /* No nodes to add, nothing to do here */
190
- continue ;
191
- }
192
- xmlUnlinkNode (newNode );
193
- } else if (newNode -> parent != NULL ) {
185
+ if (newNode -> parent != NULL ) {
194
186
xmlUnlinkNode (newNode );
195
187
}
196
188
@@ -209,14 +201,23 @@ xmlNode* dom_zvals_to_fragment(php_libxml_ref_obj *document, xmlNode *contextNod
209
201
newNode = xmlCopyNode (newNode , 1 );
210
202
}
211
203
212
- if (!xmlAddChild (fragment , newNode )) {
204
+ if (newNode -> type == XML_DOCUMENT_FRAG_NODE ) {
205
+ /* Unpack document fragment nodes, the behaviour differs for different libxml2 versions. */
206
+ newNode = newNode -> children ;
207
+ while (newNode ) {
208
+ xmlNodePtr next = newNode -> next ;
209
+ xmlUnlinkNode (newNode );
210
+ if (!xmlAddChild (fragment , newNode )) {
211
+ goto hierarchy_request_err ;
212
+ }
213
+ newNode = next ;
214
+ }
215
+ } else if (!xmlAddChild (fragment , newNode )) {
213
216
if (will_free ) {
214
217
xmlFreeNode (newNode );
215
218
}
216
219
goto hierarchy_request_err ;
217
220
}
218
-
219
- continue ;
220
221
} else {
221
222
zend_argument_type_error (i + 1 , "must be of type DOMNode|string, %s given" , zend_zval_value_name (& nodes [i ]));
222
223
goto err ;
@@ -364,14 +365,13 @@ static void dom_pre_insert(xmlNodePtr insertion_point, xmlNodePtr parentNode, xm
364
365
/* Place it as last node */
365
366
if (parentNode -> children ) {
366
367
/* There are children */
367
- fragment -> last -> prev = parentNode -> last ;
368
- newchild -> prev = parentNode -> last -> prev ;
368
+ newchild -> prev = parentNode -> last ;
369
369
parentNode -> last -> next = newchild ;
370
370
} else {
371
371
/* No children, because they moved out when they became a fragment */
372
372
parentNode -> children = newchild ;
373
- parentNode -> last = newchild ;
374
373
}
374
+ parentNode -> last = fragment -> last ;
375
375
} else {
376
376
/* Insert fragment before insertion_point */
377
377
fragment -> last -> next = insertion_point ;
0 commit comments