ID: 11321
Updated by: lobbin
Reported By: [EMAIL PROTECTED]
Old Status: Open
Status: Feedback
Bug Type: XML related
Operating System: Linux
PHP Version: 4.0.5
New Comment:

Is this reproducable on 4.1.1?


Previous Comments:
------------------------------------------------------------------------

[2001-06-06 16:18:52] [EMAIL PROTECTED]

When parsing large XML files the PHP module starts corrupting memory.
In large applications this may result in a segfault, in this example
application it results in corruption of the xml parser itself (at least
on my test machines). 

The code below is tested on three different servers, 2 of them running
Debian/Stable (Potato) with a custom compiled PHP 4.0.5, one server
running Debian/Unstable (Sid) with the Debian default PHP module (also
4.0.5). All run PHP as Apache module.

The custom build modules are build like this:
./configure --with-apxs=/usr/bin/apxs --with-mysql=/usr
--with-config-file-path=/etc/php4/apache --with-interbase=shared
--with-gnu-ld --with-xml --with-gd=shared

When using a small XML file, the code below runs fine, but when the XML
file gets bigger PHP starts complaining Unable to call handler
end_tag_handler() , Unable to call handler data_handler() or Unable to
call handler start_tag_handler().

The code:
<?php

class properties {
        var $parser;
}

class my_class {
        var $mydata;
        var $mystarttag;
        var $myendtag;

        function my_class(&$props) {
                xml_set_object($props->parser,&$this);
                xml_set_element_handler($props->parser, 'start_tag_handler',
'end_tag_handler');
                xml_set_character_data_handler($props->parser, 'data_handler');
        }
        
        function data_handler($parser, $data) {
                $this->mydata .= $data;
        }
        function start_tag_handler($parser, $name, $attrs) {
                $this->mystarttag .= $name;
        }
        function end_tag_handler($parser, $name) {
                $this->myendtag .= $name;
                echo 'end tag is '.$name.'<br>';
        }
}

function first_element_handler($parser, $name, $attrs) {
        global $props;
        if ($name == 'QUESTION') {
                /* normally I decide here, depending on $attrs what 
                kind of object I should create. For debugging purposes
                I use just one object. */
                $q_obj = new my_class($props);
        
        } else {
                die('This XML file has an unknown content');
        }
}

function start_parsing($file) {
        global $props;
        
        $props = new properties();
        $props->parser = xml_parser_create();
        xml_parser_set_option($props->parser, XML_OPTION_CASE_FOLDING, TRUE);
        xml_set_element_handler($props->parser, 'first_element_handler', '');
        if (!($fp = fopen($file, "r"))) {
                die("could not open XML input");
        }

        while ($data = fread($fp, 4096)) {
                if (!xml_parse($props->parser, $data, feof($fp))) {
                        die(sprintf("XML error: %s at line %d",
                                        
xml_error_string(xml_get_error_code($props->parser)),
                                        xml_get_current_line_number($props->parser)));
                }
        }
        xml_parser_free($props->parser);
}
echo 'start parsing';
start_parsing('val1.xml');
echo 'finished parsing';
?>

The XML file looks like this, but to see the problems the part between
<question> and </question> should be four times bigger:

<question type="VALUE">
<title>Fermentor size</title>
<hint>4032 hours a year, makes 96 runs a year. How many kg per cubic
meter per year do you produce?</hint>
<hint>That is 10 X 96 = 960 kg per cubic meter per year</hint>
<hint>You need 10.000 kg, so you need 10.4 cubic meter
production</hint>
<hint>You can't fill the reactor 100%, so let's assume 12 cubic meter
will do</hint>
<range correct="1">
<minval>11</minval>
<maxval>15</maxval>
<feedback>Very good! &lt;b&gt;Assuming&lt;/b&gt; you can fill a
reactor....</feedback>
</range>
<range correct="0">
<minval>1</minval>
<maxval>11</maxval>
<feedback>Sorry, try again</feedback>
</range>
</question>

------------------------------------------------------------------------



Edit this bug report at http://bugs.php.net/?id=11321&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