#38387 [Fbk->Opn]: Calling set_error_handler from constructor segfaults apache
| From: | trivoallan at clever-age dot com | Date: | Tue, 08 Aug 2006 22:22:15 +0000 |
| Subject: | #38387 [Fbk->Opn]: Calling set_error_handler from constructor segfaults apache | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-100554@lists.php.net to get a copy of this message | ||
ID: 38387
User updated by: trivoallan at clever-age dot com
Reported By: trivoallan at clever-age dot com
-Status: Feedback
+Status: Open
Bug Type: Apache2 related
Operating System: GNU/Linux (ubuntu dapper)
PHP Version: 5.1.4
New Comment:
bugs.php.net says : "Please do not SPAM our bug system."
so here's a link to the code : http://hashphp.org/pastebin.php?pid=8014
Previous Comments:
------------------------------------------------------------------------
[2006-08-08 22:01:43] judas dot iscariote at gmail dot com
again, need **complete** reproduce code ..
WTH the setFailureMessage() and errorOccured() methods do eh ?
------------------------------------------------------------------------
[2006-08-08 21:52:34] trivoallan at clever-age dot com
I found the source of the problem while reviewing the handleError
method code (thanks for the pointer :).
There was a missing break in the switch statement.
Should it segfault anyway ?
Here's the uncorrected code for the handleError method :
function handleRuntimeError($errno, $errstr, $errfile = null,
$errline = null, $errcontext = array() )
{
$error_types = array (
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERRROR => 'Catchable Fatal Error'
);
$msg = sprintf('%s : "%s" occured in %s on line %d',
$error_types[$errno], $errstr, $errfile, $errline);
switch($errno)
{
// A notice cannot fail the job
case E_NOTICE:
$this->setFailureMessage($msg);
default:
$this->errorOccured($msg, $this->getMaxTries());
}
}
------------------------------------------------------------------------
[2006-08-08 21:04:10] tony2001@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5.2-win32-latest.zip
Can't reproduce.
------------------------------------------------------------------------
[2006-08-08 20:48:52] judas dot iscariote at gmail dot com
what code your handleError method have ?
works perfectly fine in current 5_2 CVS... provide complete code please
;-)
------------------------------------------------------------------------
[2006-08-08 20:37:03] trivoallan at clever-age dot com
Description:
------------
Apache version : 2.0.55
Calling set_error_handler from a class constructor makes apache crash.
Calling the function from other methods works without problems.
I've run accross #24708, and the problem does not come from there.
Reproduce code:
---------------
class cbJob
{
public function __construct($id_ressource = null, $action_name =
null)
{
set_error_handler(array($this, 'handleError'));
}
public function __destruct()
{
restore_error_handler();
}
}
Expected result:
----------------
Error handler is cbJob::handleError()
Actual result:
--------------
[Tue Aug 08 22:09:49 2006] [notice] child pid 6876 exit signal
Segmentation fault (11)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=38387&edit=1