Bug #61767 [Opn->Ana]: Shutdown functions not called in certain error situation

From: Date: Fri, 20 Apr 2012 06:02:25 +0000
Subject: Bug #61767 [Opn->Ana]: Shutdown functions not called in certain error situation
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-169773@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=61767&edit=1

 ID:                 61767
 Updated by:         laruence@php.net
 Reported by:        shiranai7 at hotmail dot com
 Summary:            Shutdown functions not called in certain error
                     situation
-Status:             Open
+Status:             Analyzed
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Win7
 PHP Version:        5.4.0
 Block user comment: N
 Private report:     N

 New Comment:

I attached a fix for this, maybe need dmitry to review it.


Previous Comments:
------------------------------------------------------------------------
[2012-04-20 06:01:10] laruence@php.net

The following patch has been added/updated:

Patch Name: bug61767.patch
Revision:   1334901670
URL:        https://bugs.php.net/patch-display.php?bug=61767&patch=bug61767.patch&revision=1334901670

------------------------------------------------------------------------
[2012-04-20 05:52:05] laruence@php.net

a E_NOTICE "undefined variable" has been triggered before the FATAL_ERROR.  hmm, 
the same thing as #60909

------------------------------------------------------------------------
[2012-04-19 22:56:56] nikic@php.net

This seems related: https://bugs.php.net/bug.php?id=60909

------------------------------------------------------------------------
[2012-04-19 09:07:06] shiranai7 at hotmail dot com

Allow me to re-specify the expected result:
----------

Error handler called
Fatal error: Uncaught exception 'ErrorException' with message 'Undefined variable:
undefined' in C:\Dokumenty\localhost\base\test_case1.php:14 Stack trace: #0 _example_(14):
{closure}(8, 'Undefined varia...', 'C:\Dokumenty\lo...', 14, Array) #1 {main}
thrown in C:\Dokumenty\localhost\base\test_case1.php on line 14
Shutting down Array ( [type] => 1 [message] => Uncaught exception 'ErrorException'
with message 'Undefined variable: undefined' in _example_:14 Stack trace: ... [file] =>
_example_ [line] => 14 )

------
This is because the error_handler gets actually called for the E_NOTICE - so an exception should be
thrown (and later uncaught in the example). But the exception gets *eaten* as I described.

------------------------------------------------------------------------
[2012-04-18 18:39:02] shiranai7 at hotmail dot com

Description:
------------
I am using register_shutdown_function() toghether with error_get_last() and set_error_handler() to
"handle" fatal errors (to display message in debug screen etc, details do not matter).

Everything works perfectly except for one specific scenario - If there is an error caused by calling
a method on UNDEFINED (really undefined, not null etc) variable, then the following happens (NOT OK,
UNEXPECTED):

 1. registered error_handler is invoked for E_NOTICE (undefined variable) 
 2. the error_handler throws an ErrorException
 3. the exception gets *eaten* by something, it never makes it out of the error_handler
 4. PHP exits with FATAL error (Call to a member function foo() on a non-object)
 5. No shutdown functions get called

----

If the variable is not UNDEFINED but just not an object (e.g. null), everything happens as follows
(ALL OK, EXPECTED):

 1. PHP exits with FATAL error (Call to a member function foo() on a non-object)
 2. Registered shutdown functions are called

----

If I return TRUE from the error_handler, following happens (OK, BUT NOT ACCEPTABLE):

 1. registered error_handler is invoked for E_NOTICE (undefined variable) 
 2. the error_handler returns TRUE
 3. PHP exits with FATAL error (Call to a member function foo() on a non-object)
 4. Registered shutdown functions are called

Test script:
---------------
set_error_handler(function($code, $msg, $file = null, $line = null) {
    echo "Error handler called\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();

Expected result:
----------------
Fatal error: Call to a member function foo() on a non-object in _example_ on line 14
Shutting down Array ( [type] => 1 [message] => Call to a member function foo() on a non-object
[file] => _example_ [line] => 14 ) 

Actual result:
--------------
Error handler called
Fatal error: Call to a member function foo() on a non-object in _example_ on line 13



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61767&edit=1


Thread (13 messages)

« previous php.bugs (#169773) next »