From:             [EMAIL PROTECTED]
Operating system: RedHat 7.1
PHP version:      4.1.1
PHP Bug Type:     Reproducible crash
Bug description:  array_reduce() causes segmentation faults

This drove me crazy. array_reduce() causes segmentation faults when used in
a complex, recursive manner. I'm pretty sure it's array_reduce() and not
create_function() that's the culprit here. I'm sorry I can't provide a
simpler example, but I've been unable to reprodce the crash otherwise. I'll
try to describe what I'm doing to the best of my abilities.

debug.php is an include that I use for dumping out nicely-formatted data
structures - it works like print_r() but cleaner. It's written using
functional techniques, so I'm using create_function() as a lambda and
array_reduce() as a reduction.

tree.xml is an XML file that I'm parsing into a data structure using
wddx_deserialize(). I thought that it was my deserialization that was the
problem when I was using XML-RPC, and switched to WDDX in hopes that that
would solve the crash problem. It didn't. It took a lot of monkeying around
before I figured out where the real problem was.

I don't know how to use GDB, and I don't really have any more time to
dedicate to this, so no backtrace. Sorry. I've experienced this problem
with PHP 4.1.0, 4.1.1, and 4.2.0-dev under RedHat 7.1 and Apache 1.3.22.

Here are my source files:

crash.php (this is the one to run)

<pre>
<?php
require_once 'debug.php';

$data = wddx_deserialize(join('', file('tree.xml')));

// This works.
print_r($data);

// This doesn't.
//debug($data);
?>
</pre>

debug.php:

<?php

function array_items($array) {
    $result = array();
    foreach ($array as $key => $val) $result[] = array($key, $val);
    return $result;
}

function debug_node($key, $val) {
    return "-+ <font color=\"#ad0000\"><b>$key</b></font> "
         . "<font color=\"#505050\">(" . gettype($val) .
")</font><br>\n";
}

function debug_leaf($key, $val) {
    return "-> <b>$key</b> = <font color=\"#0000ad\">$val</font> "
         . "<font color=\"#505050\">(" . gettype($val) .
")</font><br>\n";
}

function debug_reduce($prep, $accum, $key_val) {
    list($key, $val) = $key_val;
    return "$accum$prep" . (is_array($val) ? debug_node($key,      $val)
                                           . debug_tree("$prep |", $val)
                                           : debug_leaf($key,     
$val));
}

function debug_tree($prep, $array) {
    return array_reduce(array_items($array),
                        create_function('$a, $x',
                            "return debug_reduce('$prep', \$a, \$x);"),
'');
}

function debug_array($array) {
    return "<font face=\"arial\" size=3 color=\"black\"><code>\n"
         . debug_tree('|', $array) . '</code></font>';
}

function debug_string($string) {
    return "<font face=\"arial\" size=2 color=\"black\">\n"
         . nl2br($string) . "</font>\n";
}

function debug($msg) {
    ?>
<table width="100%" border=0 cellpadding=5 cellspacing=0 bgcolor="#dedede"
bordercolor="black"><td>
<?=(is_array($msg) or is_object($msg)) ? debug_array($msg) :
debug_string($msg)?>
</td></table>
<table width="100%" height=1 cellpadding=0 cellspacing=0
bgcolor="black"><td></td></table>
    <?

    return $msg;
}

?>

tree.xml:

<?xml version="1.0"?><!DOCTYPE wddxPacket SYSTEM
"../static/wddx_0090.dtd"><wddxPacket version="0.9"><header/><data><array
length="
4"><struct><var name="label"><string>About Us</string></var><var
name="children"><array length="2"><struct><var name="label"><strin
g>Who We Are</string></var><var name="children"><array
length="0"></array></var><var
name="path"><string>about/who</string></var><v
ar name="content"><array
length="2"><number>23</number><number>42</number></array></var></struct><struct><var
name="label"><string>
What We Doodoo</string></var><var name="children"><array
length="0"></array></var><var
name="path"><string>about/what</string></var
><var name="content"><array
length="1"><number>69</number></array></var></struct></array></var><var
name="path"><string>about</stri
ng></var><var name="content"><array
length="0"></array></var></struct><struct><var
name="label"><string>Products</string></var><var
 name="children"><array length="0"></array></var><var
name="path"><string>products</string></var><var name="content"><array
length=
"2"><number>86</number><number>99</number></array></var></struct><struct><var
name="label"><string>Services</string></var><var name
="children"><array length="0"></array></var><var
name="path"><string>services</string></var><var name="content"><array
length="0"><
/array></var></struct><struct><var name="label"><string>Contact
Us</string></var><var name="children"><array length="0"></array></v
ar><var name="path"><string>contact</string></var><var
name="content"><array
length="1"><number>1</number></array></var></struct></
array></data></wddxPacket>

That's it. Good luck.

Peace,
Dave
-- 
Edit bug report at: http://bugs.php.net/?id=14749&edit=1


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to