Skip to content

Commit f24ed8c

Browse files
committed
Merge branch 'PHP-7.0'
* PHP-7.0: Fixed bug #72588 (Using global var doesn't work while accessing SimpleXML element)
2 parents 7a125a4 + 8129b83 commit f24ed8c

2 files changed

Lines changed: 81 additions & 26 deletions

File tree

ext/simplexml/simplexml.c

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -244,22 +244,29 @@ static zval *sxe_prop_dim_read(zval *object, zval *member, zend_bool elements, z
244244

245245
sxe = Z_SXEOBJ_P(object);
246246

247-
if (!member || Z_TYPE_P(member) == IS_LONG) {
248-
if (sxe->iter.type != SXE_ITER_ATTRLIST) {
249-
attribs = 0;
250-
elements = 1;
251-
} else if (!member) {
247+
if (!member) {
248+
if (sxe->iter.type == SXE_ITER_ATTRLIST) {
252249
/* This happens when the user did: $sxe[]->foo = $value */
253250
zend_throw_error(NULL, "Cannot create unnamed attribute");
254251
return &EG(uninitialized_zval);
255252
}
256-
name = NULL;
253+
goto long_dim;
257254
} else {
258-
if (Z_TYPE_P(member) != IS_STRING) {
259-
ZVAL_STR(&tmp_zv, zval_get_string(member));
260-
member = &tmp_zv;
255+
ZVAL_DEREF(member);
256+
if (Z_TYPE_P(member) == IS_LONG) {
257+
if (sxe->iter.type != SXE_ITER_ATTRLIST) {
258+
long_dim:
259+
attribs = 0;
260+
elements = 1;
261+
}
262+
name = NULL;
263+
} else {
264+
if (Z_TYPE_P(member) != IS_STRING) {
265+
ZVAL_STR(&tmp_zv, zval_get_string(member));
266+
member = &tmp_zv;
267+
}
268+
name = Z_STRVAL_P(member);
261269
}
262-
name = Z_STRVAL_P(member);
263270
}
264271

265272
GET_NODE(sxe, node);
@@ -450,32 +457,39 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool
450457

451458
sxe = Z_SXEOBJ_P(object);
452459

453-
if (!member || Z_TYPE_P(member) == IS_LONG) {
454-
if (sxe->iter.type != SXE_ITER_ATTRLIST) {
455-
attribs = 0;
456-
elements = 1;
457-
} else if (!member) {
460+
if (!member) {
461+
if (sxe->iter.type == SXE_ITER_ATTRLIST) {
458462
/* This happens when the user did: $sxe[] = $value
459463
* and could also be E_PARSE, but we use this only during parsing
460464
* and this is during runtime.
461465
*/
462466
zend_throw_error(NULL, "Cannot create unnamed attribute");
463467
return FAILURE;
464468
}
469+
goto long_dim;
465470
} else {
466-
if (Z_TYPE_P(member) != IS_STRING) {
467-
trim_str = zval_get_string(member);
468-
ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3));
469-
zend_string_release(trim_str);
470-
member = &tmp_zv;
471-
}
471+
ZVAL_DEREF(member);
472+
if (Z_TYPE_P(member) == IS_LONG) {
473+
if (sxe->iter.type != SXE_ITER_ATTRLIST) {
474+
long_dim:
475+
attribs = 0;
476+
elements = 1;
477+
}
478+
} else {
479+
if (Z_TYPE_P(member) != IS_STRING) {
480+
trim_str = zval_get_string(member);
481+
ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3));
482+
zend_string_release(trim_str);
483+
member = &tmp_zv;
484+
}
472485

473-
if (!Z_STRLEN_P(member)) {
474-
php_error_docref(NULL, E_WARNING, "Cannot write or create unnamed %s", attribs ? "attribute" : "element");
475-
if (member == &tmp_zv) {
476-
zval_dtor(&tmp_zv);
486+
if (!Z_STRLEN_P(member)) {
487+
php_error_docref(NULL, E_WARNING, "Cannot write or create unnamed %s", attribs ? "attribute" : "element");
488+
if (member == &tmp_zv) {
489+
zval_dtor(&tmp_zv);
490+
}
491+
return FAILURE;
477492
}
478-
return FAILURE;
479493
}
480494
}
481495

ext/simplexml/tests/bug72588.phpt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--TEST--
2+
Bug #72588 (Using global var doesn't work while accessing SimpleXML element)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
6+
?>
7+
--FILE--
8+
<?php
9+
10+
$tpnb = 5;
11+
$dummy = &$tpnb;
12+
13+
$xmlStruct = <<<EOF
14+
<?xml version="1.0" encoding="UTF-8"?>
15+
<templates>
16+
<object type="obj_1" label="Label for object 1"></object>
17+
<object type="obj_2" label="Label for object 2"></object>
18+
<object type="obj_3" label="Label for object 3"></object>
19+
<object type="obj_4" label="Label for object 4"></object>
20+
<object type="obj_5" label="Label for object 5"></object>
21+
<object type="obj_6" label="Label for object 6"></object>
22+
<object type="obj_7" label="Label for object 7"></object>
23+
<object type="obj_8" label="Label for object 8"></object>
24+
<object type="obj_9" label="Label for object 9"></object>
25+
<object type="obj_10" label="Label for object 10"></object>
26+
</templates>
27+
EOF;
28+
$tplxml = simplexml_load_string($xmlStruct);
29+
30+
var_dump($tplxml->object[$tpnb]);
31+
?>
32+
--EXPECTF--
33+
object(SimpleXMLElement)#%d (1) {
34+
["@attributes"]=>
35+
array(2) {
36+
["type"]=>
37+
string(5) "obj_6"
38+
["label"]=>
39+
string(18) "Label for object 6"
40+
}
41+
}

0 commit comments

Comments
 (0)