]> granicus.if.org Git - php/commitdiff
Fixed bug #72588 (Using global var doesn't work while accessing SimpleXML element)
authorXinchen Hui <laruence@gmail.com>
Wed, 13 Jul 2016 02:49:58 +0000 (10:49 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 13 Jul 2016 02:49:58 +0000 (10:49 +0800)
NEWS
ext/simplexml/simplexml.c
ext/simplexml/tests/bug72588.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 326c6c4510ac4ea1a205312d6eb384ec1bf20d4e..738568b96bd3bd745ffb733a7371e4bcb1bb7768 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,10 @@ PHP                                                                        NEWS
   . Fixed bug #72570 (Segmentation fault when binding parameters on a query
     without placeholders). (Matteo)
 
+- SimpleXML:
+  . Fixed bug #72588 (Using global var doesn't work while accessing SimpleXML
+    element). (Laruence)
+
 - SPL:
   . Fixed bug #55701 (GlobIterator throws LogicException). (Valentin VÄ‚LCIU)
 
index 8a1ef4915f2024925ab80334b809c691c2cc0196..3b27656786ea29ce872a5d3c850e387528e13eb5 100644 (file)
@@ -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;
                }
        }
 
diff --git a/ext/simplexml/tests/bug72588.phpt b/ext/simplexml/tests/bug72588.phpt
new file mode 100644 (file)
index 0000000..f32ec25
--- /dev/null
@@ -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"
+  }
+}