diff options
| author | Nikita Popov <nikic@php.net> | 2014-10-03 21:26:51 +0200 | 
|---|---|---|
| committer | Nikita Popov <nikic@php.net> | 2014-10-03 21:27:07 +0200 | 
| commit | 8617f2fa8d6feeda4c87e1c0f8697101f03429f2 (patch) | |
| tree | a4f3e6daec8699a009b164689e25eccbc9e7097f | |
| parent | 79e05bf5578f09bb26e4a8826eb94f7f4601d4f6 (diff) | |
| parent | 93288d0095cc27f8df88832e479e25ea5b00b5fd (diff) | |
| download | php-git-8617f2fa8d6feeda4c87e1c0f8697101f03429f2.tar.gz | |
Merge branch 'PHP-5.5' into PHP-5.6
| -rw-r--r-- | NEWS | 1 | ||||
| -rw-r--r-- | Zend/tests/bug68118.phpt | 21 | ||||
| -rw-r--r-- | Zend/zend_object_handlers.c | 9 | 
3 files changed, 28 insertions, 3 deletions
| @@ -8,6 +8,7 @@ PHP                                                                        NEWS    . Fixed bug #67633 (A foreach on an array returned from a function not doing      copy-on-write). (Nikita)    . Fixed bug #51800 (proc_open on Windows hangs forever). (Anatol) +  . Fixed bug #68188 ($a->foo .= 'test'; can leave $a->foo undefined). (Nikita)  - FPM:    . Fixed bug #65641 (PHP-FPM incorrectly defines the SCRIPT_NAME variable diff --git a/Zend/tests/bug68118.phpt b/Zend/tests/bug68118.phpt new file mode 100644 index 0000000000..c56e70a112 --- /dev/null +++ b/Zend/tests/bug68118.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #68118: $a->foo .= 'test'; can leave $a->foo undefined +--FILE-- +<?php + +set_error_handler(function() { +    $obj = new stdClass; +    $obj->test = 'meow'; +    return true; +}); +  +$a = new stdClass; +$a->undefined .= 'test'; +var_dump($a); + +?> +--EXPECT-- +object(stdClass)#2 (1) { +  ["undefined"]=> +  string(4) "test" +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c7adf38f3b..a5577d0b45 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -786,9 +786,6 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, int type  			/* we don't have access controls - will just add it */  			new_zval = &EG(uninitialized_zval); -			if(UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { -				zend_error(E_NOTICE, "Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member)); -			}  			Z_ADDREF_P(new_zval);  			if (EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&  			    property_info->offset >= 0) { @@ -808,6 +805,12 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, int type  				}  				zend_hash_quick_update(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, &new_zval, sizeof(zval *), (void **) &retval);  			} + +			/* Notice is thrown after creation of the property, to avoid EG(std_property_info) +			 * being overwritten in an error handler. */ +			if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { +				zend_error(E_NOTICE, "Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member)); +			}  		} else {  			/* we do have getter - fail and let it try again with usual get/set */  			retval = NULL; | 
