laruence Fri, 02 Mar 2012 03:12:15 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=323767
Log: MFH: Fixed bug #61011 (Crash when an exception is thrown by __autoload accessing a static property) Bug: https://bugs.php.net/61011 (Assigned) Crash when an exception is thrown by __autoload accessing a static property Changed paths: U php/php-src/branches/PHP_5_4/NEWS A php/php-src/branches/PHP_5_4/Zend/tests/bug61011.phpt U php/php-src/branches/PHP_5_4/Zend/zend_vm_def.h U php/php-src/branches/PHP_5_4/Zend/zend_vm_execute.h U php/php-src/trunk/NEWS
Modified: php/php-src/branches/PHP_5_4/NEWS =================================================================== --- php/php-src/branches/PHP_5_4/NEWS 2012-03-02 02:56:08 UTC (rev 323766) +++ php/php-src/branches/PHP_5_4/NEWS 2012-03-02 03:12:15 UTC (rev 323767) @@ -7,6 +7,8 @@ . Fixed bug #61165 (Segfault - strip_tags()). (Laruence) . Fixed bug #61072 (Memory leak when restoring an exception handler). (Nikic, Laruence) + . Fixed bug #61011 (Crash when an exception is thrown by __autoload + accessing a static property). (Laruence) - Standard: . Fixed memory leak in substr_replace. (Pierrick) Added: php/php-src/branches/PHP_5_4/Zend/tests/bug61011.phpt =================================================================== --- php/php-src/branches/PHP_5_4/Zend/tests/bug61011.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/Zend/tests/bug61011.phpt 2012-03-02 03:12:15 UTC (rev 323767) @@ -0,0 +1,35 @@ +--TEST-- +Bug #61011 (Crash when an exception is thrown by __autoload accessing a static property) +--FILE-- +<?php +function __autoload($name) { + throw new Exception($name); +} +try { + echo AAA::$a; //zend_fetch_var_address_helper +} catch (Exception $e) { + try { + echo AAA::XXX; //ZEND_FETCH_CONSTANT + } catch (Exception $e) { + try { + echo AAA::foo(); //ZEND_INIT_STATIC_METHOD_CALL + } catch (Exception $e) { + try { + unset(AAA::$a); // ZEND_UNSET_VAR + } catch (Exception $e){ + try { + isset(AAAA::$a); // ZEND_ISSET_ISEMPTY_VAR + } catch (Exception $e) { + try { + $a = array("AAA", "foo"); + $a(); //ZEND_INIT_FCALL_BY_NAME + } catch (Exception $e) { + } + } + } + } + } +} +echo 'okey'; +--EXPECT-- +okey Modified: php/php-src/branches/PHP_5_4/Zend/zend_vm_def.h =================================================================== --- php/php-src/branches/PHP_5_4/Zend/zend_vm_def.h 2012-03-02 02:56:08 UTC (rev 323766) +++ php/php-src/branches/PHP_5_4/Zend/zend_vm_def.h 2012-03-02 03:12:15 UTC (rev 323767) @@ -1039,6 +1039,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (OP1_TYPE != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + FREE_OP1(); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -2234,7 +2242,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -2414,7 +2423,8 @@ if (Z_TYPE_PP(obj) == IS_STRING) { ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } EX(called_scope) = ce; EX(object) = NULL; @@ -2964,6 +2974,7 @@ catch_ce = CACHED_PTR(opline->op1.literal->cache_slot); } else { catch_ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC); + CACHE_PTR(opline->op1.literal->cache_slot, catch_ce); } ce = Z_OBJCE_P(EG(exception)); @@ -3492,7 +3503,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -3879,6 +3891,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (OP1_TYPE != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { + zval_ptr_dtor(&varname); + } + FREE_OP1(); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -4368,6 +4390,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { Modified: php/php-src/branches/PHP_5_4/Zend/zend_vm_execute.h =================================================================== --- php/php-src/branches/PHP_5_4/Zend/zend_vm_execute.h 2012-03-02 02:56:08 UTC (rev 323766) +++ php/php-src/branches/PHP_5_4/Zend/zend_vm_execute.h 2012-03-02 03:12:15 UTC (rev 323767) @@ -1267,7 +1267,8 @@ if (Z_TYPE_PP(obj) == IS_STRING) { ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } EX(called_scope) = ce; EX(object) = NULL; @@ -1568,7 +1569,8 @@ if (Z_TYPE_PP(obj) == IS_STRING) { ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } EX(called_scope) = ce; EX(object) = NULL; @@ -1731,7 +1733,8 @@ if (Z_TYPE_PP(obj) == IS_STRING) { ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } EX(called_scope) = ce; EX(object) = NULL; @@ -1927,7 +1930,8 @@ if (Z_TYPE_PP(obj) == IS_STRING) { ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } EX(called_scope) = ce; EX(object) = NULL; @@ -3236,6 +3240,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CONST != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -3402,7 +3414,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -3570,7 +3583,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -3752,6 +3766,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CONST != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { + zval_ptr_dtor(&varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -3816,6 +3840,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -4188,7 +4216,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -4711,6 +4740,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CONST != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -4853,7 +4890,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -5113,6 +5151,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CONST != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { + zval_ptr_dtor(&varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -5177,6 +5225,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -5247,6 +5299,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CONST != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -5389,7 +5449,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -5631,6 +5692,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CONST != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { + zval_ptr_dtor(&varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -5695,6 +5766,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -6045,7 +6120,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -6161,6 +6237,7 @@ catch_ce = CACHED_PTR(opline->op1.literal->cache_slot); } else { catch_ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC); + CACHE_PTR(opline->op1.literal->cache_slot, catch_ce); } ce = Z_OBJCE_P(EG(exception)); @@ -7629,6 +7706,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + zval_dtor(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -8055,6 +8140,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_TMP_VAR != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { + zval_ptr_dtor(&varname); + } + zval_dtor(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -8119,6 +8214,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -8975,6 +9074,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + zval_dtor(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -9378,6 +9485,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_TMP_VAR != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { + zval_ptr_dtor(&varname); + } + zval_dtor(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -9442,6 +9559,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -9512,6 +9633,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + zval_dtor(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -9781,6 +9910,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_TMP_VAR != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { + zval_ptr_dtor(&varname); + } + zval_dtor(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -9845,6 +9984,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -12568,6 +12711,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_VAR != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -13358,7 +13509,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -13526,7 +13678,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -13708,6 +13861,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_VAR != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { + zval_ptr_dtor(&varname); + } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -13912,6 +14075,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -15511,7 +15678,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -16791,6 +16959,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_VAR != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -17638,7 +17814,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -17898,6 +18075,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_VAR != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { + zval_ptr_dtor(&varname); + } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -18102,6 +18289,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -18582,6 +18773,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_VAR != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -18890,7 +19089,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -19132,6 +19332,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_VAR != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { + zval_ptr_dtor(&varname); + } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -19196,6 +19406,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -20712,7 +20926,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -22212,7 +22427,8 @@ } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv)); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CACHE_PTR(opline->op1.literal->cache_slot, ce); } @@ -28292,6 +28508,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CV != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -29218,6 +29442,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CV != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_CV == IS_VAR || IS_CV == IS_CV) { + zval_ptr_dtor(&varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -29420,6 +29654,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -32168,6 +32406,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CV != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -33151,6 +33397,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CV != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_CV == IS_VAR || IS_CV == IS_CV) { + zval_ptr_dtor(&varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -33353,6 +33609,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -33830,6 +34090,14 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CV != IS_CONST && varname == &tmp_varname) { + zval_dtor(&tmp_varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -34264,6 +34532,16 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + if (IS_CV != IS_CONST && varname == &tmp) { + zval_dtor(&tmp); + } else if (IS_CV == IS_VAR || IS_CV == IS_CV) { + zval_ptr_dtor(&varname); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { @@ -34328,6 +34606,10 @@ ce = CACHED_PTR(opline->op2.literal->cache_slot); } else { ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); + if (UNEXPECTED(ce == NULL)) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } CACHE_PTR(opline->op2.literal->cache_slot, ce); } } else { Modified: php/php-src/trunk/NEWS =================================================================== --- php/php-src/trunk/NEWS 2012-03-02 02:56:08 UTC (rev 323766) +++ php/php-src/trunk/NEWS 2012-03-02 03:12:15 UTC (rev 323767) @@ -6,8 +6,6 @@ . World domination - Core: - . Fixed bug #61011 (Crash when an exception is thrown by __autoload - accessing a static property). (Laruence) . Fixed bug #61000 (Exceeding max nesting level doesn't delete numerical vars). (Laruence) . Fixed bug #60978 (exit code incorrect). (Laruence)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php