ID: 29944
Comment by: tingle at virtuanews dot co dot uk
Reported By: norxh at binnews dot com
Status: Assigned
Bug Type: Reproducible crash
Operating System: *
PHP Version: 5CVS-2005-03-07
Assigned To: andi
New Comment:
I have just tried this with the latest CVS (after spending 4 hours bug
finding!). This bug is still in CVS.
Exactly the same as is shown here, the following will crash apache:
<?php
$do = 1;
switch ($do) {
default:
function test_function()
{
return 'Hello World';
}
echo test_function();
}
?>
This crashes both apache 1 and apache 2 on windows xp, macosx and linux
based systems. I was testing on the CVS from 23/04/05.
Previous Comments:
------------------------------------------------------------------------
[2005-04-02 12:05:10] dmhouse at gmail dot com
I have a reduced test case for this bug.
<?php
$foo = 'bar';
switch ($foo) {
case 'bar':
function foobar() {
$variable = 1;
}
foobar();
break;
}
?>
Things necessary for Apache to segfault:
* The function must be defined inside a case statement that is
executed.
* A variable must be set to a value within the function.
* The function must be called.
I'm running PHP 5.0.3 (built from source, but I doubt that matters) on
Apache 2. Bug is reproducible through Apache and through CLI.
------------------------------------------------------------------------
[2005-03-04 15:17:24] kameshj at fastmail dot fm
Problem is in CG(switch_cond_stack) that is shared by two op_arrays(One
which has original switch and another one being the function declararion
inside a case).
Case 1
----------------
<?php
function foo()
{
echo "hi";
}
?>
op_array of foo
ZEND_ECHO
ZEND_FETCH_CONSTANT
ZEND_RETURN
ZEND_HANDLE_EXCEPTION
Case 2(Segfault case)
----------------
<?php
$a=1;
switch($a)
{
case 1:
function foo()
{
echo "hi";
}
}
?>
op_array of foo
ZEND_ECHO
ZEND_FETCH_CONSTANT
ZEND_SWITCH_FREE
ZEND_RETURN
ZEND_HANDLE_EXCEPTION
In Case 2
ZEND_SWITCH_FREE opcode is getting included in the function foo's
op_array.
This is done by zend_do_return in zend_compile.c with the following
code
zend_stack_apply(&CG(switch_cond_stack), ZEND_STACK_APPLY_TOPDOWN, (int
(*)(void *element)) generate_free_switch_expr);
In zend_do_return of foo of Case 2,
While executing zend_stack_apply,
CG(switch_cond_stack) has 2 entries as follows,
foo's seperator dummy switch_cond(at top)
main op_array's switch case(at bottom)
"main op_array's switch case(at bottom)" is generating ZEND_SWITCH_FREE
opcode.
I feel the switch_cond_stack to be op_array specific rather than
keeping it at compiler_globals as it is now.
------------------------------------------------------------------------
[2004-12-16 21:18:18] edwin at phpfreakz dot nl
I didn't have any problems with declaring functions in a switch
statement with Apache 2/PHP 5.0.1, but after installing PHP 5.0.3 php
crashes. You don't get any errors, it just doesn't work.
I'm using Windows XP Pro with SP2.
------------------------------------------------------------------------
[2004-11-10 15:53:24] sami at sipponen dot com
<?
switch ($_GET["test"]) {
default:
function testfunc() {
}
}
testfunc();
?>
This code crashes PHP 5.1.0-DEV Windows Version.
------------------------------------------------------------------------
[2004-09-02 08:36:55] [EMAIL PROTECTED]
This is only a problem in PHP 5.0.x (and not PHP 5.1.x-dev).
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/29944
--
Edit this bug report at http://bugs.php.net/?id=29944&edit=1