mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
- Fix crash in exception handling (zend_exception_error(...) and
zend_eval_string_ex() were buggy (Dmitry, Andi)
This commit is contained in:
parent
5e4b287463
commit
7c72f6ff61
@ -1061,8 +1061,6 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co
|
||||
}
|
||||
} else {
|
||||
zend_exception_error(EG(exception) TSRMLS_CC);
|
||||
zval_ptr_dtor(&EG(exception));
|
||||
EG(exception) = NULL;
|
||||
}
|
||||
efree(params);
|
||||
zval_ptr_dtor(&old_exception);
|
||||
@ -1072,8 +1070,6 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co
|
||||
}
|
||||
} else {
|
||||
zend_exception_error(EG(exception) TSRMLS_CC);
|
||||
zval_ptr_dtor(&EG(exception));
|
||||
EG(exception) = NULL;
|
||||
}
|
||||
if (retval == NULL && *EG(return_value_ptr_ptr) != NULL) {
|
||||
zval_ptr_dtor(EG(return_value_ptr_ptr));
|
||||
|
@ -508,12 +508,12 @@ static void zend_error_va(int type, const char *file, uint lineno, const char *f
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/* This function doesn't return as it calls E_ERROR */
|
||||
ZEND_API void zend_exception_error(zval *exception TSRMLS_DC)
|
||||
{
|
||||
zend_class_entry *ce_exception = Z_OBJCE_P(exception);
|
||||
if (instanceof_function(ce_exception, default_exception_ce TSRMLS_CC)) {
|
||||
zval *str, *file, *line;
|
||||
zval *old_exception = EG(exception);
|
||||
|
||||
EG(exception) = NULL;
|
||||
|
||||
@ -543,8 +543,6 @@ ZEND_API void zend_exception_error(zval *exception TSRMLS_DC)
|
||||
file = zend_read_property(default_exception_ce, exception, "file", sizeof("file")-1, 1 TSRMLS_CC);
|
||||
line = zend_read_property(default_exception_ce, exception, "line", sizeof("line")-1, 1 TSRMLS_CC);
|
||||
|
||||
EG(exception) = old_exception;
|
||||
|
||||
zend_error_va(E_ERROR, Z_STRVAL_P(file), Z_LVAL_P(line), "Uncaught %s\n thrown", Z_STRVAL_P(str));
|
||||
} else {
|
||||
zend_error(E_ERROR, "Uncaught exception '%s'", ce_exception->name);
|
||||
|
@ -926,16 +926,10 @@ ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSR
|
||||
ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC)
|
||||
{
|
||||
int result;
|
||||
zval *exception = EG(exception);
|
||||
|
||||
if (handle_exceptions) {
|
||||
EG(exception) = NULL;
|
||||
}
|
||||
result = zend_eval_string(str, retval_ptr, string_name TSRMLS_CC);
|
||||
if (handle_exceptions && EG(exception)) {
|
||||
zend_exception_error(EG(exception) TSRMLS_CC);
|
||||
zval_ptr_dtor(&EG(exception));
|
||||
EG(exception) = exception;
|
||||
result = FAILURE;
|
||||
}
|
||||
return result;
|
||||
|
Loading…
Reference in New Issue
Block a user