@@ -1452,7 +1452,7 @@ void dom_objects_free_storage(zend_object *object)
1452
1452
}
1453
1453
/* }}} */
1454
1454
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 ) /* {{{ */
1456
1456
{
1457
1457
dom_nnodemap_object * mapptr = (dom_nnodemap_object * ) intern -> ptr ;
1458
1458
@@ -1473,24 +1473,23 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
1473
1473
const xmlChar * tmp ;
1474
1474
1475
1475
if (local ) {
1476
- int len = (int ) local_len ;
1476
+ int len = (int ) ZSTR_LEN ( local ) ;
1477
1477
if (doc != NULL && (tmp = xmlDictExists (doc -> dict , (const xmlChar * )local , len )) != NULL ) {
1478
1478
mapptr -> local = BAD_CAST tmp ;
1479
1479
} 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;
1482
1482
}
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 );
1485
1484
}
1486
1485
1487
1486
if (ns ) {
1488
- int len = (int ) ns_len ;
1487
+ int len = (int ) ZSTR_LEN ( ns ) ;
1489
1488
if (doc != NULL && (tmp = xmlDictExists (doc -> dict , (const xmlChar * )ns , len )) != NULL ) {
1490
1489
mapptr -> ns = BAD_CAST tmp ;
1491
1490
} 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;
1494
1493
}
1495
1494
}
1496
1495
}
@@ -1561,6 +1560,11 @@ zend_object *dom_xpath_objects_new(zend_class_entry *class_type)
1561
1560
1562
1561
#endif
1563
1562
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
+
1564
1568
void dom_nnodemap_objects_free_storage (zend_object * object ) /* {{{ */
1565
1569
{
1566
1570
dom_object * intern = php_dom_obj_from_obj (object );
@@ -1570,14 +1574,14 @@ void dom_nnodemap_objects_free_storage(zend_object *object) /* {{{ */
1570
1574
if (objmap -> cached_obj && GC_DELREF (& objmap -> cached_obj -> std ) == 0 ) {
1571
1575
zend_objects_store_del (& objmap -> cached_obj -> std );
1572
1576
}
1573
- if (objmap -> free_local ) {
1574
- xmlFree (objmap -> local );
1577
+ if (objmap -> release_local ) {
1578
+ dom_zend_string_release_from_char_pointer (objmap -> local );
1575
1579
}
1576
- if (objmap -> free_ns ) {
1577
- xmlFree (objmap -> ns );
1580
+ if (objmap -> release_ns ) {
1581
+ dom_zend_string_release_from_char_pointer (objmap -> ns );
1578
1582
}
1579
1583
if (objmap -> local_lower ) {
1580
- efree (objmap -> local_lower );
1584
+ zend_string_release (objmap -> local_lower );
1581
1585
}
1582
1586
if (!Z_ISUNDEF (objmap -> baseobj_zv )) {
1583
1587
zval_ptr_dtor (& objmap -> baseobj_zv );
@@ -1607,9 +1611,9 @@ zend_object *dom_nnodemap_objects_new(zend_class_entry *class_type)
1607
1611
objmap -> ht = NULL ;
1608
1612
objmap -> local = NULL ;
1609
1613
objmap -> local_lower = NULL ;
1610
- objmap -> free_local = false;
1614
+ objmap -> release_local = false;
1611
1615
objmap -> ns = NULL ;
1612
- objmap -> free_ns = false;
1616
+ objmap -> release_ns = false;
1613
1617
objmap -> cache_tag .modification_nr = 0 ;
1614
1618
objmap -> cached_length = -1 ;
1615
1619
objmap -> cached_obj = NULL ;
@@ -1865,7 +1869,7 @@ static bool dom_match_qualified_name_for_tag_name_equality(const xmlChar *local,
1865
1869
return dom_match_qualified_name_according_to_spec (local_to_use , nodep );
1866
1870
}
1867
1871
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 ) /* {{{ */
1869
1873
{
1870
1874
/* Can happen with detached document */
1871
1875
if (UNEXPECTED (nodep == NULL )) {
@@ -1884,7 +1888,7 @@ xmlNode *dom_get_elements_by_tag_name_ns_raw(xmlNodePtr basep, xmlNodePtr nodep,
1884
1888
1885
1889
while (* cur <= index ) {
1886
1890
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 )) {
1888
1892
if (ns_match_any || (ns [0 ] == '\0' && nodep -> ns == NULL ) || (nodep -> ns != NULL && xmlStrEqual (nodep -> ns -> href , ns ))) {
1889
1893
if (* cur == index ) {
1890
1894
ret = nodep ;
0 commit comments