summaryrefslogtreecommitdiff
path: root/ext/simplexml/simplexml.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2016-07-13 10:49:58 +0800
committerXinchen Hui <laruence@gmail.com>2016-07-13 10:49:58 +0800
commit8129b839922c14e1a4b3a82c702faa178e1cdec3 (patch)
treeb20a5f8bd538096c78fe785a9c98b47be8f7a225 /ext/simplexml/simplexml.c
parentbe77ce37fd3290365a359f7143cc636d66f14cf1 (diff)
downloadphp-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.c66
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;
}
}