mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Merge branch 'PHP-8.5'
* PHP-8.5:
Fix EG(current_execute_data) introduced in 1292037
This commit is contained in:
25
Zend/tests/oss_fuzz_456317305.phpt
Normal file
25
Zend/tests/oss_fuzz_456317305.phpt
Normal file
@@ -0,0 +1,25 @@
|
||||
--TEST--
|
||||
OSS-Fuzz #456317305: EG(current_execute_data) NULL pointer violation
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class C {
|
||||
public function __destruct() {
|
||||
static $again = true;
|
||||
if ($again) {
|
||||
$again = false;
|
||||
$c = new C;
|
||||
}
|
||||
throw new Exception;
|
||||
}
|
||||
}
|
||||
|
||||
$c = new C;
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Exception in %s:%d
|
||||
Stack trace:
|
||||
#0 [internal function]: C->__destruct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
||||
@@ -312,9 +312,11 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
|
||||
zend_object *old_exception = NULL;
|
||||
const zend_op *old_opline_before_exception = NULL;
|
||||
if (EG(exception)) {
|
||||
EG(current_execute_data)->opline = EG(opline_before_exception);
|
||||
if (EG(current_execute_data)) {
|
||||
EG(current_execute_data)->opline = EG(opline_before_exception);
|
||||
old_opline_before_exception = EG(opline_before_exception);
|
||||
}
|
||||
old_exception = EG(exception);
|
||||
old_opline_before_exception = EG(opline_before_exception);
|
||||
EG(exception) = NULL;
|
||||
}
|
||||
|
||||
@@ -327,8 +329,10 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
|
||||
zend_generator_resume(generator);
|
||||
|
||||
if (old_exception) {
|
||||
EG(current_execute_data)->opline = EG(exception_op);
|
||||
EG(opline_before_exception) = old_opline_before_exception;
|
||||
if (EG(current_execute_data)) {
|
||||
EG(current_execute_data)->opline = EG(exception_op);
|
||||
EG(opline_before_exception) = old_opline_before_exception;
|
||||
}
|
||||
if (EG(exception)) {
|
||||
zend_exception_set_previous(EG(exception), old_exception);
|
||||
} else {
|
||||
|
||||
@@ -121,7 +121,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
|
||||
}
|
||||
|
||||
zend_object *old_exception;
|
||||
const zend_op *old_opline_before_exception;
|
||||
const zend_op *old_opline_before_exception = NULL;
|
||||
|
||||
if (destructor->common.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
|
||||
if (EG(current_execute_data)) {
|
||||
@@ -156,14 +156,15 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
|
||||
if (EG(exception) == object) {
|
||||
zend_error_noreturn(E_CORE_ERROR, "Attempt to destruct pending exception");
|
||||
} else {
|
||||
if (EG(current_execute_data)
|
||||
&& EG(current_execute_data)->func
|
||||
&& ZEND_USER_CODE(EG(current_execute_data)->func->common.type)) {
|
||||
zend_rethrow_exception(EG(current_execute_data));
|
||||
if (EG(current_execute_data)) {
|
||||
if (EG(current_execute_data)->func
|
||||
&& ZEND_USER_CODE(EG(current_execute_data)->func->common.type)) {
|
||||
zend_rethrow_exception(EG(current_execute_data));
|
||||
}
|
||||
EG(current_execute_data)->opline = EG(opline_before_exception);
|
||||
old_opline_before_exception = EG(opline_before_exception);
|
||||
}
|
||||
EG(current_execute_data)->opline = EG(opline_before_exception);
|
||||
old_exception = EG(exception);
|
||||
old_opline_before_exception = EG(opline_before_exception);
|
||||
EG(exception) = NULL;
|
||||
}
|
||||
}
|
||||
@@ -171,8 +172,10 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
|
||||
zend_call_known_instance_method_with_0_params(destructor, object, NULL);
|
||||
|
||||
if (old_exception) {
|
||||
EG(current_execute_data)->opline = EG(exception_op);
|
||||
EG(opline_before_exception) = old_opline_before_exception;
|
||||
if (EG(current_execute_data)) {
|
||||
EG(current_execute_data)->opline = EG(exception_op);
|
||||
EG(opline_before_exception) = old_opline_before_exception;
|
||||
}
|
||||
if (EG(exception)) {
|
||||
zend_exception_set_previous(EG(exception), old_exception);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user