felipe Sun, 01 Aug 2010 13:27:02 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=301755
Log: - Fixed bug #52484 (__set() ignores setting properties with empty names) Bug: http://bugs.php.net/52484 (Open) __set() ignores setting properties with empty names Changed paths: U php/php-src/branches/PHP_5_3/NEWS A php/php-src/branches/PHP_5_3/Zend/tests/bug52484.phpt A php/php-src/branches/PHP_5_3/Zend/tests/bug52484_2.phpt A php/php-src/branches/PHP_5_3/Zend/tests/bug52484_3.phpt U php/php-src/branches/PHP_5_3/Zend/zend_object_handlers.c A php/php-src/trunk/Zend/tests/bug52484.phpt A php/php-src/trunk/Zend/tests/bug52484_2.phpt A php/php-src/trunk/Zend/tests/bug52484_3.phpt U php/php-src/trunk/Zend/zend_object_handlers.c
Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2010-08-01 04:03:08 UTC (rev 301754) +++ php/php-src/branches/PHP_5_3/NEWS 2010-08-01 13:27:02 UTC (rev 301755) @@ -2,6 +2,8 @@ ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2010, PHP 5.3.4 - Fixed bug #52487 (PDO::FETCH_INTO leaks memory). (Felipe) +- Fixed bug #52484 (__set() ignores setting properties with empty names). + (Felipe) - Fixed bug #52436 (Compile error if systems do not have stdint.h) (Sriram Natarajan) Added: php/php-src/branches/PHP_5_3/Zend/tests/bug52484.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug52484.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug52484.phpt 2010-08-01 13:27:02 UTC (rev 301755) @@ -0,0 +1,19 @@ +--TEST-- +Bug #52484 (__set() ignores setting properties with empty names) +--FILE-- +<?php + +class A { + function __unset($prop) { + unset($this->$prop); + } +} + +$a = new A(); +$prop = null; + +unset($a->$prop); + +?> +--EXPECTF-- +Fatal error: Cannot access empty property in %s on line %d Property changes on: php/php-src/branches/PHP_5_3/Zend/tests/bug52484.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/branches/PHP_5_3/Zend/tests/bug52484_2.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug52484_2.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug52484_2.phpt 2010-08-01 13:27:02 UTC (rev 301755) @@ -0,0 +1,19 @@ +--TEST-- +Bug #52484.2 (__set() ignores setting properties with empty names) +--FILE-- +<?php + +class A { + function __set($prop, $val) { + $this->$prop = $val; + } +} + +$a = new A(); +$prop = null; + +$a->$prop = 2; + +?> +--EXPECTF-- +Fatal error: Cannot access empty property in %s on line %d Property changes on: php/php-src/branches/PHP_5_3/Zend/tests/bug52484_2.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/branches/PHP_5_3/Zend/tests/bug52484_3.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug52484_3.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug52484_3.phpt 2010-08-01 13:27:02 UTC (rev 301755) @@ -0,0 +1,19 @@ +--TEST-- +Bug #52484.3 (__set() ignores setting properties with empty names) +--FILE-- +<?php + +class A { + function __get($prop) { + var_dump($this->$prop); + } +} + +$a = new A(); +$prop = null; + +var_dump($a->$prop); + +?> +--EXPECTF-- +Fatal error: Cannot access empty property in %s on line %d Property changes on: php/php-src/branches/PHP_5_3/Zend/tests/bug52484_3.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/branches/PHP_5_3/Zend/zend_object_handlers.c =================================================================== --- php/php-src/branches/PHP_5_3/Zend/zend_object_handlers.c 2010-08-01 04:03:08 UTC (rev 301754) +++ php/php-src/branches/PHP_5_3/Zend/zend_object_handlers.c 2010-08-01 13:27:02 UTC (rev 301755) @@ -340,7 +340,7 @@ property_info = zend_get_property_info(zobj->ce, member, (zobj->ce->__get != NULL) TSRMLS_CC); if (!property_info || zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) { - zend_guard *guard; + zend_guard *guard = NULL; if (zobj->ce->__get && zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && @@ -373,6 +373,15 @@ } zval_ptr_dtor(&object); } else { + if (zobj->ce->__get && guard && guard->in_get == 1) { + if (Z_STRVAL_P(member)[0] == '\0') { + if (Z_STRLEN_P(member) == 0) { + zend_error(E_ERROR, "Cannot access empty property"); + } else { + zend_error(E_ERROR, "Cannot access property started with '\\0'"); + } + } + } if (!silent) { zend_error(E_NOTICE,"Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member)); } @@ -437,7 +446,7 @@ } } else { int setter_done = 0; - zend_guard *guard; + zend_guard *guard = NULL; if (zobj->ce->__set && zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && @@ -460,6 +469,14 @@ SEPARATE_ZVAL(&value); } zend_hash_quick_update(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, &value, sizeof(zval *), (void **) &foo); + } else if (zobj->ce->__set && guard && guard->in_set == 1) { + if (Z_STRVAL_P(member)[0] == '\0') { + if (Z_STRLEN_P(member) == 0) { + zend_error(E_ERROR, "Cannot access empty property"); + } else { + zend_error(E_ERROR, "Cannot access property started with '\\0'"); + } + } } } @@ -619,7 +636,7 @@ property_info = zend_get_property_info(zobj->ce, member, (zobj->ce->__unset != NULL) TSRMLS_CC); if (!property_info || zend_hash_quick_del(zobj->properties, property_info->name, property_info->name_length+1, property_info->h) == FAILURE) { - zend_guard *guard; + zend_guard *guard = NULL; if (zobj->ce->__unset && zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && @@ -630,6 +647,14 @@ zend_std_call_unsetter(object, member TSRMLS_CC); guard->in_unset = 0; zval_ptr_dtor(&object); + } else if (zobj->ce->__unset && guard && guard->in_unset == 1) { + if (Z_STRVAL_P(member)[0] == '\0') { + if (Z_STRLEN_P(member) == 0) { + zend_error(E_ERROR, "Cannot access empty property"); + } else { + zend_error(E_ERROR, "Cannot access property started with '\\0'"); + } + } } } Added: php/php-src/trunk/Zend/tests/bug52484.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug52484.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug52484.phpt 2010-08-01 13:27:02 UTC (rev 301755) @@ -0,0 +1,19 @@ +--TEST-- +Bug #52484 (__set() ignores setting properties with empty names) +--FILE-- +<?php + +class A { + function __unset($prop) { + unset($this->$prop); + } +} + +$a = new A(); +$prop = null; + +unset($a->$prop); + +?> +--EXPECTF-- +Fatal error: Cannot access empty property in %s on line %d Property changes on: php/php-src/trunk/Zend/tests/bug52484.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/trunk/Zend/tests/bug52484_2.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug52484_2.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug52484_2.phpt 2010-08-01 13:27:02 UTC (rev 301755) @@ -0,0 +1,19 @@ +--TEST-- +Bug #52484.2 (__set() ignores setting properties with empty names) +--FILE-- +<?php + +class A { + function __set($prop, $val) { + $this->$prop = $val; + } +} + +$a = new A(); +$prop = null; + +$a->$prop = 2; + +?> +--EXPECTF-- +Fatal error: Cannot access empty property in %s on line %d Property changes on: php/php-src/trunk/Zend/tests/bug52484_2.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/trunk/Zend/tests/bug52484_3.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug52484_3.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug52484_3.phpt 2010-08-01 13:27:02 UTC (rev 301755) @@ -0,0 +1,19 @@ +--TEST-- +Bug #52484.3 (__set() ignores setting properties with empty names) +--FILE-- +<?php + +class A { + function __get($prop) { + var_dump($this->$prop); + } +} + +$a = new A(); +$prop = null; + +var_dump($a->$prop); + +?> +--EXPECTF-- +Fatal error: Cannot access empty property in %s on line %d Property changes on: php/php-src/trunk/Zend/tests/bug52484_3.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/trunk/Zend/zend_object_handlers.c =================================================================== --- php/php-src/trunk/Zend/zend_object_handlers.c 2010-08-01 04:03:08 UTC (rev 301754) +++ php/php-src/trunk/Zend/zend_object_handlers.c 2010-08-01 13:27:02 UTC (rev 301755) @@ -412,7 +412,7 @@ (*(retval = &zobj->properties_table[property_info->offset]) == NULL)) : (UNEXPECTED(!zobj->properties) || UNEXPECTED(zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE)))) { - zend_guard *guard; + zend_guard *guard = NULL; if (zobj->ce->__get && zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && @@ -445,6 +445,15 @@ } zval_ptr_dtor(&object); } else { + if (zobj->ce->__get && guard && guard->in_get == 1) { + if (Z_STRVAL_P(member)[0] == '\0') { + if (Z_STRLEN_P(member) == 0) { + zend_error(E_ERROR, "Cannot access empty property"); + } else { + zend_error(E_ERROR, "Cannot access property started with '\\0'"); + } + } + } if (!silent) { zend_error(E_NOTICE,"Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member)); } @@ -517,7 +526,7 @@ } } else { int setter_done = 0; - zend_guard *guard; + zend_guard *guard = NULL; if (zobj->ce->__set && zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && @@ -530,6 +539,14 @@ setter_done = 1; guard->in_set = 0; zval_ptr_dtor(&object); + } else if (zobj->ce->__set && guard && guard->in_set == 1) { + if (Z_STRVAL_P(member)[0] == '\0') { + if (Z_STRLEN_P(member) == 0) { + zend_error(E_ERROR, "Cannot access empty property"); + } else { + zend_error(E_ERROR, "Cannot access property started with '\\0'"); + } + } } if (!setter_done && EXPECTED(property_info != NULL)) { /* if we assign referenced variable, we should separate it */ @@ -746,7 +763,7 @@ } else if (UNEXPECTED(!property_info) || !zobj->properties || UNEXPECTED(zend_hash_quick_del(zobj->properties, property_info->name, property_info->name_length+1, property_info->h) == FAILURE)) { - zend_guard *guard; + zend_guard *guard = NULL; if (zobj->ce->__unset && zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && @@ -757,6 +774,14 @@ zend_std_call_unsetter(object, member TSRMLS_CC); guard->in_unset = 0; zval_ptr_dtor(&object); + } else if (zobj->ce->__unset && guard && guard->in_unset == 1) { + if (Z_STRVAL_P(member)[0] == '\0') { + if (Z_STRLEN_P(member) == 0) { + zend_error(E_ERROR, "Cannot access empty property"); + } else { + zend_error(E_ERROR, "Cannot access property started with '\\0'"); + } + } } } else if (EXPECTED(property_info != NULL) && EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php