summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/property_guard_hash_val.phpt16
-rw-r--r--Zend/zend_object_handlers.c4
2 files changed, 18 insertions, 2 deletions
diff --git a/Zend/tests/property_guard_hash_val.phpt b/Zend/tests/property_guard_hash_val.phpt
new file mode 100644
index 0000000000..9215523064
--- /dev/null
+++ b/Zend/tests/property_guard_hash_val.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test property guard hash value assumption
+--FILE--
+<?php
+class Test {
+ function __get($var) {
+ return $this->{$var.''};
+ }
+}
+
+$test = new Test;
+var_dump($test->x);
+?>
+--EXPECTF--
+Notice: Undefined property: Test::$x in %s on line %d
+NULL
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index a0a5e48dee..4dcfadc239 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -619,8 +619,8 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
if (EXPECTED(Z_TYPE_P(zv) == IS_STRING)) {
zend_string *str = Z_STR_P(zv);
if (EXPECTED(str == member) ||
- /* hash values are always pred-calculated here */
- (EXPECTED(ZSTR_H(str) == ZSTR_H(member)) &&
+ /* "str" always has a pre-calculated hash value here */
+ (EXPECTED(ZSTR_H(str) == zend_string_hash_val(member)) &&
EXPECTED(zend_string_equal_content(str, member)))) {
return &Z_PROPERTY_GUARD_P(zv);
} else if (EXPECTED(Z_PROPERTY_GUARD_P(zv) == 0)) {