-
-
Save datibbaw/0abee3137865be480444 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c | |
index 01a0a6c..d8167ad 100644 | |
--- a/ext/dom/php_dom.c | |
+++ b/ext/dom/php_dom.c | |
@@ -1681,43 +1681,42 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) { | |
static int dom_nodelist_fetch_dimension(xmlNodePtr *itemnode, zval *offset, dom_nnodemap_object *objmap, zval *rv TSRMLS_DC) /* {{{ */ | |
{ | |
- convert_to_long(offset); | |
- long index = Z_LVAL_P(offset); | |
+ long index; | |
+ zval offset_copy; | |
HashTable *nodeht; | |
zval **entry; | |
- int ret = 0; | |
+ xmlNodePtr tmp = NULL; | |
+ | |
+ convert_to_long_copy(offset, offset_copy); | |
+ index = Z_LVAL_P(offset); | |
+ if (offset == &offset_copy) { | |
+ zval_dtor(offset); | |
+ } | |
if (objmap->ht) { | |
- *itemnode = dom_nodelist_xml_item(objmap, index); | |
+ tmp = dom_nodelist_xml_item(objmap, index); | |
} else { | |
if (objmap->nodetype == DOM_NODESET) { | |
nodeht = HASH_OF(objmap->baseobjptr); | |
- if (zend_hash_index_find(nodeht, index, (void **) &entry) == SUCCESS) { | |
- if (itemnode != NULL && rv != NULL) { | |
+ if (zend_hash_index_find(nodeht, index, (void **)&entry) == SUCCESS) { | |
+ if (itemnode && rv) { | |
/* Passed by read_dimension */ | |
MAKE_COPY_ZVAL(entry, rv); | |
+ *itemnode = NULL; | |
} | |
- ret = 1; | |
+ return SUCCESS; | |
} | |
} else if (objmap->baseobj) { | |
- if (itemnode == NULL && rv == NULL) { | |
- /* Passed by has_dimension */ | |
- if (dom_nodelist_baseobj_item(objmap, index)) { | |
- ret = 1; | |
- } | |
- } else { | |
- *itemnode = dom_nodelist_baseobj_item(objmap, index); | |
- } | |
+ tmp = dom_nodelist_baseobj_item(objmap, index); | |
} | |
} | |
- if (rv != NULL && itemnode != NULL) { | |
- if (*itemnode) { | |
- ret = 1; | |
- } | |
+ if (itemnode) { | |
+ *itemnode = tmp; | |
} | |
- return ret; | |
+ return tmp ? SUCCESS : FAILURE; | |
} /* }}} end dom_nodelist_fetch_dimension */ | |
zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC) /* {{{ */ | |
@@ -1728,13 +1727,17 @@ zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC | |
zval *rv; | |
int found; | |
+ if (!offset) { | |
+ return NULL; | |
+ } | |
+ | |
ALLOC_INIT_ZVAL(rv); | |
intern = (dom_object *) zend_object_store_get_object(object TSRMLS_CC); | |
objmap = (dom_nnodemap_object *)intern->ptr; | |
- if (dom_nodelist_fetch_dimension(&itemnode, offset, objmap, rv TSRMLS_CC)) { | |
+ if (dom_nodelist_fetch_dimension(&itemnode, offset, objmap, rv TSRMLS_CC) == SUCCESS) { | |
if (itemnode) { | |
php_dom_create_object(itemnode, &found, rv, objmap->baseobj TSRMLS_CC); | |
} | |
@@ -1753,7 +1756,7 @@ int dom_nodelist_has_dimension(zval *object, zval *member, int check_empty TSRML | |
intern = (dom_object *) zend_object_store_get_object(object TSRMLS_CC); | |
objmap = (dom_nnodemap_object *)intern->ptr; | |
- return dom_nodelist_fetch_dimension(NULL, member, objmap, NULL TSRMLS_CC); | |
+ return dom_nodelist_fetch_dimension(NULL, member, objmap, NULL TSRMLS_CC) == SUCCESS ? 1 : 0; | |
} /* }}} end dom_nodelist_has_dimension */ | |
#endif /* HAVE_DOM */ | |
diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h | |
index eb35aa0..d6a1729 100644 | |
--- a/ext/dom/php_dom.h | |
+++ b/ext/dom/php_dom.h | |
@@ -151,11 +151,9 @@ entry = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC); | |
#define convert_to_copy_master(orig, copy, lower_type, upper_type) \ | |
if (Z_TYPE_P(orig) != IS_##upper_type) { \ | |
- if (Z_REFCOUNT_P(orig) > 1) { \ | |
- copy = *orig; \ | |
- zval_copy_ctor(©); \ | |
- orig = © \ | |
- } \ | |
+ copy = *orig; \ | |
+ zval_copy_ctor(©); \ | |
+ orig = © \ | |
convert_to_##lower_type(orig); \ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment