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