PHP 4.0 Bug #3959: bogus references to $this
| From: | alan at sanguis dot com dot au | Date: | Wed, 29 Mar 2000 18:05:23 +0000 |
| Subject: | PHP 4.0 Bug #3959: bogus references to $this | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-17353@lists.php.net to get a copy of this message | ||
From: alan@sanguis.com.au
Operating system: rh 6.0 2.2.11
PHP version: 4.0 Latest CVS (29/03/2000)
PHP Bug Type: Scripting Engine problem
Bug description: bogus references to $this
When creating nested objects thus;
$a=new person(
"mamma",
array(
new person(
"b",
array(
new person(
"c"
)
)
)
)
);
what ever $this is point to during the construction of the autovivfied objects doesnt seem to hang
around. References made to $this during construction dont seem to be valid latter, resulting in a
segfault due to the inability of Zend to resolve the reference (from a backtrace it apears to loop
until it runs out of memory).
Here is some code that produces the segfault;
class person{
function person($name="default_name", $kids=""){
$this->name=$name;
if(is_array($kids))foreach($kids as $val){
$kid->parent=&$this; // problem line here, but I dont
// want a copy...
$this->kids[$kid->name]=$kid;
}
}
function whos_ya_mamma(){
if(is_array($this->kids)){
foreach($this->kids as $val){
$this->whos_ya_mamma();
}
}
$par=$this->parent;
echo $this->name." says '".$par->name." is my
mamma'<br>";
}
$a=new person(
"mamma",
array(
new person(
"b",
array(
new person(
"c"
)
)
)
)
);
$a->whos_ya_mamma();
?>
result in a 'document contained no data' browser error with the following
gdb message;
Program received signal SIGSEGV, Segmentation fault.
execute (op_array=0x815334c) at ./zend_execute.c:1216
1216 zend_fetch_var_address(&opline->result,
&opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
and the backtrace;
#0 execute (op_array=0x815334c) at ./zend_execute.c:1216
#1 0x40599af2 in execute (op_array=0x815334c) at ./zend_execute.c:1624
#2 0x40599af2 in execute (op_array=0x815334c) at ./zend_execute.c:1624
#3 0x40599af2 in execute (op_array=0x815334c) at ./zend_execute.c:1624
<snip>
#10977 0x40599af2 in execute (op_array=0x815334c) at ./zend_execute.c:1624
#10978 0x40599af2 in execute (op_array=0x814b54c) at ./zend_execute.c:1624
#10979 0x40583f77 in php_execute_script (primary_file=0xbffffb48)
at main.c:1146
#10980 0x405b04b0 in apache_php_module_main (r=0x8125d30, fd=26,
display_source_mode=0) at sapi_apache.c:88
#10981 0x405b0d74 in send_php (r=0x8125d30, display_source_mode=0,
filename=0x8127848 "/home/httpd/htdocs/test.php")
at mod_php4.c:491
#10982 0x405b0db0 in send_parsed_php (r=0x8125d30) at mod_php4.c:503
#10983 0x8053ffe in ap_invoke_handler ()
#10984 0x806218b in process_request_internal ()
#10985 0x80621e8 in ap_process_request ()
#10986 0x805c258 in child_main ()
#10987 0x805c3b7 in make_child ()
#10988 0x805c4b8 in startup_children ()
I have a userland hack workaround that _copies_ each object to a global array at the end of the
constructor (with its own quirks) available on request.