Skip to content

Commit b4c74c5

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #63206: Fully support error/exception_handler stacking, even with null or inside the handler
2 parents 98ad4d3 + 1e50c81 commit b4c74c5

File tree

4 files changed

+86
-5
lines changed

4 files changed

+86
-5
lines changed

Zend/tests/bug63206.phpt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--TEST--
2+
Bug #63206 Fully support error_handler stacking, even inside the error_handler
3+
--FILE--
4+
<?php
5+
6+
set_error_handler(function() {
7+
echo 'First handler' . PHP_EOL;
8+
});
9+
10+
set_error_handler(function() {
11+
echo 'Second handler' . PHP_EOL;
12+
13+
set_error_handler(function() {
14+
echo 'Internal handler' . PHP_EOL;
15+
});
16+
17+
$triggerInternalNotice++; // warnings while handling the error should go into internal handler
18+
19+
restore_error_handler();
20+
});
21+
22+
$triggerNotice1++;
23+
$triggerNotice2++;
24+
?>
25+
--EXPECTF--
26+
Second handler
27+
Internal handler
28+
Second handler
29+
Internal handler

Zend/tests/bug63206_1.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Bug #63206 Fully support error_handler stacking, even with null
3+
--FILE--
4+
<?php
5+
6+
set_error_handler(function() {
7+
echo 'First handler' . PHP_EOL;
8+
});
9+
10+
set_error_handler(function() {
11+
echo 'Second handler' . PHP_EOL;
12+
});
13+
14+
set_error_handler(null);
15+
16+
set_error_handler(function() {
17+
echo 'Fourth handler' . PHP_EOL;
18+
});
19+
20+
restore_error_handler();
21+
restore_error_handler();
22+
23+
$triggerNotice++;
24+
?>
25+
--EXPECTF--
26+
Second handler

Zend/tests/bug63206_2.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Bug #63206 Fully support exception_handler stacking, even with null
3+
--FILE--
4+
<?php
5+
6+
set_exception_handler(function() {
7+
echo 'First handler' . PHP_EOL;
8+
});
9+
10+
set_exception_handler(function() {
11+
echo 'Second handler' . PHP_EOL;
12+
});
13+
14+
set_exception_handler(null);
15+
16+
set_exception_handler(function() {
17+
echo 'Fourth handler' . PHP_EOL;
18+
});
19+
20+
restore_exception_handler();
21+
restore_exception_handler();
22+
23+
throw new Exception();
24+
?>
25+
--EXPECTF--
26+
Second handler

Zend/zend_builtin_functions.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,11 +1396,11 @@ ZEND_FUNCTION(set_error_handler)
13961396

13971397
if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {
13981398
ZVAL_COPY(return_value, &EG(user_error_handler));
1399-
1400-
zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting));
1401-
zend_stack_push(&EG(user_error_handlers), &EG(user_error_handler));
14021399
}
14031400

1401+
zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting));
1402+
zend_stack_push(&EG(user_error_handlers), &EG(user_error_handler));
1403+
14041404
if (Z_TYPE_P(error_handler) == IS_NULL) { /* unset user-defined handler */
14051405
ZVAL_UNDEF(&EG(user_error_handler));
14061406
return;
@@ -1460,10 +1460,10 @@ ZEND_FUNCTION(set_exception_handler)
14601460

14611461
if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
14621462
ZVAL_COPY(return_value, &EG(user_exception_handler));
1463-
1464-
zend_stack_push(&EG(user_exception_handlers), &EG(user_exception_handler));
14651463
}
14661464

1465+
zend_stack_push(&EG(user_exception_handlers), &EG(user_exception_handler));
1466+
14671467
if (Z_TYPE_P(exception_handler) == IS_NULL) { /* unset user-defined handler */
14681468
ZVAL_UNDEF(&EG(user_exception_handler));
14691469
return;

0 commit comments

Comments
 (0)