Bug #68648 [Com]: call_user_func inside __callStatic cause segmentation fault
| From: | claudiu at paun dot com | Date: | Wed, 07 Jan 2015 16:48:27 +0000 |
| Subject: | Bug #68648 [Com]: call_user_func inside __callStatic cause segmentation fault | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-189703@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=68648&edit=1
ID: 68648
Comment by: claudiu at paun dot com
Reported by: valentiny510 at gmail dot com
Summary: call_user_func inside __callStatic cause
segmentation fault
Status: Not a bug
Type: Bug
Package: Reproducible crash
Operating System: Windows 8 x64
PHP Version: 5.6.4
Block user comment: N
Private report: N
New Comment:
BTW, You said the problem is 'is_callable', so in my opinion 'is_callable'
should only determine if the method IS CALLABLE and not actually CALL the method and avoiding this
way the "infinite recursion"...
Previous Comments:
------------------------------------------------------------------------
[2015-01-07 16:36:53] claudiu at paun dot com
Well done requinix, well done, you just solved all the problems by using the button "Not a
bug" and washed your hands.
If an internal function can break the server you just call this "Not a bug" ?
Dude, seriously, why dont you studied medicine ?
------------------------------------------------------------------------
[2014-12-25 05:32:49] valentiny510 at gmail dot com
Ok, my bad using is_callable, but even so, the method should have a limit for the recursion or try
to detect if the tested callable method is the same method from where was called and this way avoit
the problem, in my opinion is still a bug but for is_callable.
Why you cant do something similar to this ?
function is_callable($method)
{
if ($method == __FUNCTION__) return; break; whatever...
# Do the loop here...
}
the thing is, php should never have the ability to break other things like in this case the apache,
run in some sandbox style, test the code in the background and then push into some opcache
Cheers !
------------------------------------------------------------------------
[2014-12-24 22:51:05] requinix@php.net
is_callable() will return true because you've implemented __callStatic. You created infinite
recursion.
method_exists() won't do that.
------------------------------------------------------------------------
[2014-12-24 15:08:20] valentiny510 at gmail dot com
Description:
------------
This piece of code make my apache to restart with status 3221225477.
One quick search on the web and find that is a segmentation fault on windows.
#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L)
I tried different combinations, with or without namespace, etc.., but the result is always the same,
Ex:
call_user_func(array('X', $method));
call_user_func(__NAMESPACE__ . '\X::exist');
call_user_func(array(__NAMESPACE__ . '\X', 'exist'));
I guess will recursively call the same method over and over but at least php should not crash the
apache or throw something
Test script:
---------------
<?php
namespace Y;
class X
{
public static function __callStatic($method, $args) {
if (is_callable([__CLASS__, $method])) {
if (empty($args)) {
call_user_func([__CLASS__, $method]);
return;
}
call_user_func([__CLASS__, $method], join(',', $args));
return;
}
throw new Exception("The class '" . __CLASS__ . "' does not have a
method called '$method'");
}
}
var_dump(X::exist('la bla'));
Expected result:
----------------
The class 'X' does not have a method called 'exist'
Actual result:
--------------
apache shutdown and restart
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=68648&edit=1