diff options
-rw-r--r-- | ext/simplexml/simplexml.c | 66 | ||||
-rw-r--r-- | ext/simplexml/tests/bug72588.phpt | 41 |
2 files changed, 81 insertions, 26 deletions
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 8685934d4f..f1eefa7856 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -244,22 +244,29 @@ static zval *sxe_prop_dim_read(zval *object, zval *member, zend_bool elements, z sxe = Z_SXEOBJ_P(object); - if (!member || Z_TYPE_P(member) == IS_LONG) { - if (sxe->iter.type != SXE_ITER_ATTRLIST) { - attribs = 0; - elements = 1; - } else if (!member) { + if (!member) { + if (sxe->iter.type == SXE_ITER_ATTRLIST) { /* This happens when the user did: $sxe[]->foo = $value */ zend_throw_error(NULL, "Cannot create unnamed attribute"); return &EG(uninitialized_zval); } - name = NULL; + goto long_dim; } else { - if (Z_TYPE_P(member) != IS_STRING) { - ZVAL_STR(&tmp_zv, zval_get_string(member)); - member = &tmp_zv; + ZVAL_DEREF(member); + if (Z_TYPE_P(member) == IS_LONG) { + if (sxe->iter.type != SXE_ITER_ATTRLIST) { +long_dim: + attribs = 0; + elements = 1; + } + name = NULL; + } else { + if (Z_TYPE_P(member) != IS_STRING) { + ZVAL_STR(&tmp_zv, zval_get_string(member)); + member = &tmp_zv; + } + name = Z_STRVAL_P(member); } - name = Z_STRVAL_P(member); } GET_NODE(sxe, node); @@ -450,11 +457,8 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool sxe = Z_SXEOBJ_P(object); - if (!member || Z_TYPE_P(member) == IS_LONG) { - if (sxe->iter.type != SXE_ITER_ATTRLIST) { - attribs = 0; - elements = 1; - } else if (!member) { + if (!member) { + if (sxe->iter.type == SXE_ITER_ATTRLIST) { /* This happens when the user did: $sxe[] = $value * and could also be E_PARSE, but we use this only during parsing * and this is during runtime. @@ -462,20 +466,30 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool zend_throw_error(NULL, "Cannot create unnamed attribute"); return FAILURE; } + goto long_dim; } else { - if (Z_TYPE_P(member) != IS_STRING) { - trim_str = zval_get_string(member); - ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3)); - zend_string_release(trim_str); - member = &tmp_zv; - } + ZVAL_DEREF(member); + if (Z_TYPE_P(member) == IS_LONG) { + if (sxe->iter.type != SXE_ITER_ATTRLIST) { +long_dim: + attribs = 0; + elements = 1; + } + } else { + if (Z_TYPE_P(member) != IS_STRING) { + trim_str = zval_get_string(member); + ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3)); + zend_string_release(trim_str); + member = &tmp_zv; + } - if (!Z_STRLEN_P(member)) { - php_error_docref(NULL, E_WARNING, "Cannot write or create unnamed %s", attribs ? "attribute" : "element"); - if (member == &tmp_zv) { - zval_dtor(&tmp_zv); + if (!Z_STRLEN_P(member)) { + php_error_docref(NULL, E_WARNING, "Cannot write or create unnamed %s", attribs ? "attribute" : "element"); + if (member == &tmp_zv) { + zval_dtor(&tmp_zv); + } + return FAILURE; } - return FAILURE; } } diff --git a/ext/simplexml/tests/bug72588.phpt b/ext/simplexml/tests/bug72588.phpt new file mode 100644 index 0000000000..f32ec25104 --- /dev/null +++ b/ext/simplexml/tests/bug72588.phpt @@ -0,0 +1,41 @@ +--TEST-- +Bug #72588 (Using global var doesn't work while accessing SimpleXML element) +--SKIPIF-- +<?php +if (!extension_loaded("simplexml")) die("skip SimpleXML not available"); +?> +--FILE-- +<?php + +$tpnb = 5; +$dummy = &$tpnb; + +$xmlStruct = <<<EOF +<?xml version="1.0" encoding="UTF-8"?> +<templates> + <object type="obj_1" label="Label for object 1"></object> + <object type="obj_2" label="Label for object 2"></object> + <object type="obj_3" label="Label for object 3"></object> + <object type="obj_4" label="Label for object 4"></object> + <object type="obj_5" label="Label for object 5"></object> + <object type="obj_6" label="Label for object 6"></object> + <object type="obj_7" label="Label for object 7"></object> + <object type="obj_8" label="Label for object 8"></object> + <object type="obj_9" label="Label for object 9"></object> + <object type="obj_10" label="Label for object 10"></object> +</templates> +EOF; +$tplxml = simplexml_load_string($xmlStruct); + +var_dump($tplxml->object[$tpnb]); +?> +--EXPECTF-- +object(SimpleXMLElement)#%d (1) { + ["@attributes"]=> + array(2) { + ["type"]=> + string(5) "obj_6" + ["label"]=> + string(18) "Label for object 6" + } +} |