diff options
author | Xinchen Hui <laruence@gmail.com> | 2016-07-13 10:49:58 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2016-07-13 10:49:58 +0800 |
commit | 8129b839922c14e1a4b3a82c702faa178e1cdec3 (patch) | |
tree | b20a5f8bd538096c78fe785a9c98b47be8f7a225 /ext/simplexml/simplexml.c | |
parent | be77ce37fd3290365a359f7143cc636d66f14cf1 (diff) | |
download | php-git-8129b839922c14e1a4b3a82c702faa178e1cdec3.tar.gz |
Fixed bug #72588 (Using global var doesn't work while accessing SimpleXML element)
Diffstat (limited to 'ext/simplexml/simplexml.c')
-rw-r--r-- | ext/simplexml/simplexml.c | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 8a1ef4915f..3b27656786 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 */ php_error_docref(NULL, E_ERROR, "Cannot create unnamed attribute"); return NULL; } - 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 php_error_docref(NULL, E_ERROR, "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; } } |