@@ -54,6 +54,16 @@ static void php_sxe_iterator_move_forward(zend_object_iterator *iter);
54
54
static void php_sxe_iterator_rewind (zend_object_iterator * iter );
55
55
static zend_result sxe_object_cast_ex (zend_object * readobj , zval * writeobj , int type );
56
56
57
+ static void sxe_unlink_node (xmlNodePtr node )
58
+ {
59
+ xmlUnlinkNode (node );
60
+ /* Only destroy the nodes if we have no objects using them anymore.
61
+ * Don't assume simplexml owns these. */
62
+ if (!node -> _private ) {
63
+ php_libxml_node_free_resource (node );
64
+ }
65
+ }
66
+
57
67
/* {{{ _node_as_zval() */
58
68
static void _node_as_zval (php_sxe_object * sxe , xmlNodePtr node , zval * value , SXE_ITER itertype , char * name , const xmlChar * nsprefix , int isprefix )
59
69
{
@@ -554,8 +564,7 @@ static zval *sxe_prop_dim_write(zend_object *object, zval *member, zval *value,
554
564
}
555
565
if (value_str ) {
556
566
while ((tempnode = (xmlNodePtr ) newnode -> children )) {
557
- xmlUnlinkNode (tempnode );
558
- php_libxml_node_free_resource ((xmlNodePtr ) tempnode );
567
+ sxe_unlink_node (tempnode );
559
568
}
560
569
change_node_zval (newnode , value_str );
561
570
}
@@ -829,8 +838,7 @@ static void sxe_prop_dim_delete(zend_object *object, zval *member, bool elements
829
838
while (attr && nodendx <= Z_LVAL_P (member )) {
830
839
if ((!test || xmlStrEqual (attr -> name , sxe -> iter .name )) && match_ns (sxe , (xmlNodePtr ) attr , sxe -> iter .nsprefix , sxe -> iter .isprefix )) {
831
840
if (nodendx == Z_LVAL_P (member )) {
832
- xmlUnlinkNode ((xmlNodePtr ) attr );
833
- php_libxml_node_free_resource ((xmlNodePtr ) attr );
841
+ sxe_unlink_node ((xmlNodePtr ) attr );
834
842
break ;
835
843
}
836
844
nodendx ++ ;
@@ -841,8 +849,7 @@ static void sxe_prop_dim_delete(zend_object *object, zval *member, bool elements
841
849
while (attr ) {
842
850
anext = attr -> next ;
843
851
if ((!test || xmlStrEqual (attr -> name , sxe -> iter .name )) && xmlStrEqual (attr -> name , (xmlChar * )Z_STRVAL_P (member )) && match_ns (sxe , (xmlNodePtr ) attr , sxe -> iter .nsprefix , sxe -> iter .isprefix )) {
844
- xmlUnlinkNode ((xmlNodePtr ) attr );
845
- php_libxml_node_free_resource ((xmlNodePtr ) attr );
852
+ sxe_unlink_node ((xmlNodePtr ) attr );
846
853
break ;
847
854
}
848
855
attr = anext ;
@@ -857,8 +864,7 @@ static void sxe_prop_dim_delete(zend_object *object, zval *member, bool elements
857
864
}
858
865
node = sxe_get_element_by_offset (sxe , Z_LVAL_P (member ), node , NULL );
859
866
if (node ) {
860
- xmlUnlinkNode (node );
861
- php_libxml_node_free_resource (node );
867
+ sxe_unlink_node (node );
862
868
}
863
869
} else {
864
870
node = node -> children ;
@@ -868,8 +874,7 @@ static void sxe_prop_dim_delete(zend_object *object, zval *member, bool elements
868
874
SKIP_TEXT (node );
869
875
870
876
if (xmlStrEqual (node -> name , (xmlChar * )Z_STRVAL_P (member )) && match_ns (sxe , node , sxe -> iter .nsprefix , sxe -> iter .isprefix )) {
871
- xmlUnlinkNode (node );
872
- php_libxml_node_free_resource (node );
877
+ sxe_unlink_node (node );
873
878
}
874
879
875
880
next_iter :
0 commit comments