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

Reply via email to