Skip to content

Commit

Permalink
- Fixed bug #61767 (Shutdown functions not called in certain error si…
Browse files Browse the repository at this point in the history
…tuation)

- Fixed bug #60909 (custom error handler throwing Exception + fatal error = no shutdown function)
  • Loading branch information
dstogov committed Sep 6, 2012
1 parent 94582f9 commit b29dc14
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 1 deletion.
6 changes: 5 additions & 1 deletion NEWS
Expand Up @@ -13,9 +13,13 @@ PHP NEWS
. Fixed bug #62744 (dangling pointers made by zend_disable_class). (Laruence)
. Fixed bug #62716 (munmap() is called with the incorrect length).
(slangley@google.com)
. Fixed bug ##62460 (php binaries installed as binary.dSYM). (Reeze Xia)
. Fixed bug #62460 (php binaries installed as binary.dSYM). (Reeze Xia)
. Fixed bug #61767 (Shutdown functions not called in certain error
situation). (Dmitry)
. Fixed bug #60194 (--with-zend-multibyte and --enable-debug reports LEAK
with run-test.php). (Laruence)
. Fixed bug #60909 (custom error handler throwing Exception + fatal error
= no shutdown function). (Dmitry)

- CURL:
. Fixed bug #62839 (curl_copy_handle segfault with CURLOPT_FILE). (Pierrick)
Expand Down
6 changes: 6 additions & 0 deletions Zend/tests/bug51394.phpt
Expand Up @@ -13,4 +13,10 @@ function eh()
set_error_handler("eh");
$a = $empty($b);
--EXPECTF--
Warning: Uncaught exception 'Exception' with message 'error!' in %sbug51394.php:4
Stack trace:
#0 %sbug51394.php(9): eh(8, 'Undefined varia...', '%s', 9, Array)
#1 {main}
thrown in %sbug51394.php on line 4

Fatal error: Function name must be a string in %sbug51394.php on line 9
24 changes: 24 additions & 0 deletions Zend/tests/bug60909_1.phpt
@@ -0,0 +1,24 @@
--TEST--
Bug #60909 (custom error handler throwing Exception + fatal error = no shutdown function).
--FILE--
<?php
register_shutdown_function(function(){echo("\n\n!!!shutdown!!!\n\n");});
set_error_handler(function($errno, $errstr, $errfile, $errline){
echo "error($errstr)";
throw new Exception("Foo");
});

require 'notfound.php';
--EXPECTF--
error(require(notfound.php): failed to open stream: No such file or directory)
Warning: Uncaught exception 'Exception' with message 'Foo' in %sbug60909_1.php:5
Stack trace:
#0 %sbug60909_1.php(8): {closure}(2, 'require(notfoun...', '%s', 8, Array)
#1 %sbug60909_1.php(8): require()
#2 {main}
thrown in %sbug60909_1.php on line 5

Fatal error: main(): Failed opening required 'notfound.php' (include_path='%s') in %sbug60909_1.php on line 8


!!!shutdown!!!
20 changes: 20 additions & 0 deletions Zend/tests/bug60909_2.phpt
@@ -0,0 +1,20 @@
--TEST--
Bug #60909 (custom error handler throwing Exception + fatal error = no shutdown function).
--FILE--
<?php
register_shutdown_function(function(){echo("\n\n!!!shutdown!!!\n\n");});
set_error_handler(function($errno, $errstr, $errfile, $errline){throw new Exception("Foo");});

class Bad {
public function __toString() {
throw new Exception('Oops, I cannot do this');
}
}

$bad = new Bad();
echo "$bad";
--EXPECTF--
Fatal error: Method Bad::__toString() must not throw an exception in %sbug60909_2.php on line 0


!!!shutdown!!!
34 changes: 34 additions & 0 deletions Zend/tests/bug61767.phpt
@@ -0,0 +1,34 @@
--TEST--
Bug #61767 (Shutdown functions not called in certain error situation)
--FILE--
<?php
set_error_handler(function($code, $msg, $file = null, $line = null) {
echo "Error handler called ($msg)\n";
throw new \ErrorException($msg, $code, 0, $file, $line);
});

register_shutdown_function(function(){
echo "Shutting down\n";
print_r(error_get_last());
});

//$undefined = null; // defined variable does not cause problems
$undefined->foo();
--EXPECTF--
Error handler called (Undefined variable: undefined)

Warning: Uncaught exception 'ErrorException' with message 'Undefined variable: undefined' in %sbug61767.php:13
Stack trace:
#0 %sbug61767.php(13): {closure}(8, 'Undefined varia...', '%s', 13, Array)
#1 {main}
thrown in %sbug61767.php on line 13

Fatal error: Call to a member function foo() on a non-object in %sbug61767.php on line 13
Shutting down
Array
(
[type] => 1
[message] => Call to a member function foo() on a non-object
[file] => %sbug61767.php
[line] => 13
)
23 changes: 23 additions & 0 deletions Zend/zend.c
Expand Up @@ -997,6 +997,29 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
zend_stack labels_stack;
TSRMLS_FETCH();

/* Report about uncaught exception in case of fatal errors */
if (EG(exception)) {
switch (type) {
case E_CORE_ERROR:
case E_ERROR:
case E_RECOVERABLE_ERROR:
case E_PARSE:
case E_COMPILE_ERROR:
case E_USER_ERROR:
if (zend_is_executing(TSRMLS_C)) {
error_lineno = zend_get_executed_lineno(TSRMLS_C);
}
zend_exception_error(EG(exception), E_WARNING TSRMLS_CC);
EG(exception) = NULL;
if (zend_is_executing(TSRMLS_C) && EG(opline_ptr)) {
active_opline->lineno = error_lineno;
}
break;
default:
break;
}
}

/* Obtain relevant filename and lineno */
switch (type) {
case E_CORE_ERROR:
Expand Down
1 change: 1 addition & 0 deletions Zend/zend_object_handlers.c
Expand Up @@ -1272,6 +1272,7 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
if (retval) {
zval_ptr_dtor(&retval);
}
EG(exception) = NULL;
zend_error(E_ERROR, "Method %s::__toString() must not throw an exception", ce->name);
return FAILURE;
}
Expand Down

0 comments on commit b29dc14

Please sign in to comment.