From: Xinchen Hui Date: Wed, 13 Jul 2016 02:50:15 +0000 (+0800) Subject: Merge branch 'PHP-7.0' X-Git-Tag: php-7.1.0beta1~80^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f24ed8c2fec937872fe72cb311b28018debe99af;p=php Merge branch 'PHP-7.0' * PHP-7.0: Fixed bug #72588 (Using global var doesn't work while accessing SimpleXML element) --- f24ed8c2fec937872fe72cb311b28018debe99af diff --cc ext/simplexml/simplexml.c index 8685934d4f,3b27656786..f1eefa7856 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@@ -244,22 -244,29 +244,29 @@@ static zval *sxe_prop_dim_read(zval *ob 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 */ - php_error_docref(NULL, E_ERROR, "Cannot create unnamed attribute"); - return NULL; + 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); @@@ -459,23 -463,33 +463,33 @@@ static int sxe_prop_dim_write(zval *obj * and could also be E_PARSE, but we use this only during parsing * and this is during runtime. */ - php_error_docref(NULL, E_ERROR, "Cannot create unnamed attribute"); + 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; } }