]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.0'
authorXinchen Hui <laruence@gmail.com>
Wed, 13 Jul 2016 02:50:15 +0000 (10:50 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 13 Jul 2016 02:50:15 +0000 (10:50 +0800)
* PHP-7.0:
  Fixed bug #72588 (Using global var doesn't work while accessing SimpleXML element)

1  2 
ext/simplexml/simplexml.c

index 8685934d4fec5e8819567a691054bd4e125c9454,3b27656786ea29ce872a5d3c850e387528e13eb5..f1eefa785679424070b0e71d872fc4d7fbbeded2
@@@ -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;
                }
        }