@@ -1452,7 +1452,7 @@ void dom_objects_free_storage(zend_object *object)
14521452}
14531453/* }}} */
14541454
1455- void dom_namednode_iter (dom_object * basenode , int ntype , dom_object * intern , xmlHashTablePtr ht , const char * local , size_t local_len , const char * ns , size_t ns_len ) /* {{{ */
1455+ void dom_namednode_iter (dom_object * basenode , int ntype , dom_object * intern , xmlHashTablePtr ht , zend_string * local , zend_string * ns ) /* {{{ */
14561456{
14571457 dom_nnodemap_object * mapptr = (dom_nnodemap_object * ) intern -> ptr ;
14581458
@@ -1473,24 +1473,23 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
14731473 const xmlChar * tmp ;
14741474
14751475 if (local ) {
1476- int len = (int ) local_len ;
1476+ int len = (int ) ZSTR_LEN ( local ) ;
14771477 if (doc != NULL && (tmp = xmlDictExists (doc -> dict , (const xmlChar * )local , len )) != NULL ) {
14781478 mapptr -> local = BAD_CAST tmp ;
14791479 } else {
1480- mapptr -> local = xmlCharStrndup ( local , len );
1481- mapptr -> free_local = true;
1480+ mapptr -> local = BAD_CAST ZSTR_VAL ( zend_string_copy ( local ) );
1481+ mapptr -> release_local = true;
14821482 }
1483- mapptr -> local_lower = BAD_CAST estrdup (local );
1484- zend_str_tolower ((char * ) mapptr -> local_lower , len );
1483+ mapptr -> local_lower = zend_string_tolower (local );
14851484 }
14861485
14871486 if (ns ) {
1488- int len = (int ) ns_len ;
1487+ int len = (int ) ZSTR_LEN ( ns ) ;
14891488 if (doc != NULL && (tmp = xmlDictExists (doc -> dict , (const xmlChar * )ns , len )) != NULL ) {
14901489 mapptr -> ns = BAD_CAST tmp ;
14911490 } else {
1492- mapptr -> ns = xmlCharStrndup ( ns , len );
1493- mapptr -> free_ns = true;
1491+ mapptr -> ns = BAD_CAST ZSTR_VAL ( zend_string_copy ( ns ) );
1492+ mapptr -> release_ns = true;
14941493 }
14951494 }
14961495}
@@ -1561,6 +1560,11 @@ zend_object *dom_xpath_objects_new(zend_class_entry *class_type)
15611560
15621561#endif
15631562
1563+ /* The char pointer MUST refer to the char* of a zend_string struct */
1564+ static void dom_zend_string_release_from_char_pointer (xmlChar * ptr ) {
1565+ zend_string_release ((zend_string * ) (ptr - XtOffsetOf (zend_string , val )));
1566+ }
1567+
15641568void dom_nnodemap_objects_free_storage (zend_object * object ) /* {{{ */
15651569{
15661570 dom_object * intern = php_dom_obj_from_obj (object );
@@ -1570,14 +1574,14 @@ void dom_nnodemap_objects_free_storage(zend_object *object) /* {{{ */
15701574 if (objmap -> cached_obj && GC_DELREF (& objmap -> cached_obj -> std ) == 0 ) {
15711575 zend_objects_store_del (& objmap -> cached_obj -> std );
15721576 }
1573- if (objmap -> free_local ) {
1574- xmlFree (objmap -> local );
1577+ if (objmap -> release_local ) {
1578+ dom_zend_string_release_from_char_pointer (objmap -> local );
15751579 }
1576- if (objmap -> free_ns ) {
1577- xmlFree (objmap -> ns );
1580+ if (objmap -> release_ns ) {
1581+ dom_zend_string_release_from_char_pointer (objmap -> ns );
15781582 }
15791583 if (objmap -> local_lower ) {
1580- efree (objmap -> local_lower );
1584+ zend_string_release (objmap -> local_lower );
15811585 }
15821586 if (!Z_ISUNDEF (objmap -> baseobj_zv )) {
15831587 zval_ptr_dtor (& objmap -> baseobj_zv );
@@ -1607,9 +1611,9 @@ zend_object *dom_nnodemap_objects_new(zend_class_entry *class_type)
16071611 objmap -> ht = NULL ;
16081612 objmap -> local = NULL ;
16091613 objmap -> local_lower = NULL ;
1610- objmap -> free_local = false;
1614+ objmap -> release_local = false;
16111615 objmap -> ns = NULL ;
1612- objmap -> free_ns = false;
1616+ objmap -> release_ns = false;
16131617 objmap -> cache_tag .modification_nr = 0 ;
16141618 objmap -> cached_length = -1 ;
16151619 objmap -> cached_obj = NULL ;
@@ -1865,7 +1869,7 @@ static bool dom_match_qualified_name_for_tag_name_equality(const xmlChar *local,
18651869 return dom_match_qualified_name_according_to_spec (local_to_use , nodep );
18661870}
18671871
1868- xmlNode * dom_get_elements_by_tag_name_ns_raw (xmlNodePtr basep , xmlNodePtr nodep , xmlChar * ns , xmlChar * local , xmlChar * local_lower , zend_long * cur , zend_long index ) /* {{{ */
1872+ xmlNode * dom_get_elements_by_tag_name_ns_raw (xmlNodePtr basep , xmlNodePtr nodep , xmlChar * ns , xmlChar * local , zend_string * local_lower , zend_long * cur , zend_long index ) /* {{{ */
18691873{
18701874 /* Can happen with detached document */
18711875 if (UNEXPECTED (nodep == NULL )) {
@@ -1884,7 +1888,7 @@ xmlNode *dom_get_elements_by_tag_name_ns_raw(xmlNodePtr basep, xmlNodePtr nodep,
18841888
18851889 while (* cur <= index ) {
18861890 if (nodep -> type == XML_ELEMENT_NODE ) {
1887- if (local_match_any || dom_match_qualified_name_for_tag_name_equality (local , local_lower , nodep , match_qname )) {
1891+ if (local_match_any || dom_match_qualified_name_for_tag_name_equality (local , BAD_CAST ZSTR_VAL ( local_lower ) , nodep , match_qname )) {
18881892 if (ns_match_any || (ns [0 ] == '\0' && nodep -> ns == NULL ) || (nodep -> ns != NULL && xmlStrEqual (nodep -> ns -> href , ns ))) {
18891893 if (* cur == index ) {
18901894 ret = nodep ;
0 commit comments