summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/bug68163.phpt13
-rw-r--r--Zend/zend_object_handlers.c15
2 files changed, 18 insertions, 10 deletions
diff --git a/Zend/tests/bug68163.phpt b/Zend/tests/bug68163.phpt
new file mode 100644
index 0000000000..2ea0da33d6
--- /dev/null
+++ b/Zend/tests/bug68163.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #68163: Using reference as object property name
+--FILE--
+<?php
+
+$obj = (object) ['foo' => 'bar'];
+$foo = 'foo';
+$ref =& $foo;
+var_dump($obj->$foo);
+
+?>
+--EXPECT--
+string(3) "bar"
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 5ee9847b6c..02c2b10268 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -475,8 +475,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_
ZVAL_UNDEF(&tmp_member);
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_DUP(&tmp_member, member);
- convert_to_string(&tmp_member);
+ ZVAL_STR(&tmp_member, zval_get_string(member));
member = &tmp_member;
cache_slot = NULL;
}
@@ -567,8 +566,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v
ZVAL_UNDEF(&tmp_member);
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_DUP(&tmp_member, member);
- convert_to_string(&tmp_member);
+ ZVAL_STR(&tmp_member, zval_get_string(member));
member = &tmp_member;
cache_slot = NULL;
}
@@ -786,8 +784,7 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type,
ZVAL_UNDEF(&tmp_member);
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_DUP(&tmp_member, member);
- convert_to_string(&tmp_member);
+ ZVAL_STR(&tmp_member, zval_get_string(member));
member = &tmp_member;
cache_slot = NULL;
}
@@ -855,8 +852,7 @@ static void zend_std_unset_property(zval *object, zval *member, void **cache_slo
ZVAL_UNDEF(&tmp_member);
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_DUP(&tmp_member, member);
- convert_to_string(&tmp_member);
+ ZVAL_STR(&tmp_member, zval_get_string(member));
member = &tmp_member;
cache_slot = NULL;
}
@@ -1453,8 +1449,7 @@ static int zend_std_has_property(zval *object, zval *member, int has_set_exists,
ZVAL_UNDEF(&tmp_member);
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_DUP(&tmp_member, member);
- convert_to_string(&tmp_member);
+ ZVAL_STR(&tmp_member, zval_get_string(member));
member = &tmp_member;
cache_slot = NULL;
}