ID:               24002
 User updated by:  derek at hostopia dot com
 Reported By:      derek at hostopia dot com
 Status:           Bogus
 Bug Type:         XML related
 Operating System: Linux
 PHP Version:      4.3.3RC5-dev, 5.0.0b2-dev
 New Comment:

True, but that doesn't explain why it worked with all versions of PHP
prior to 4.3.X, and then stopped working ;)

We've worked around this "issue", but it has definately added a little
overhead to the script.

I still think the XML parser should be more robust and dynamic.


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

[2003-09-23 15:08:55] [EMAIL PROTECTED]

xml_parse cant be used like this as you already found out:
http://mail.libexpat.org/pipermail/expat-discuss/2003-June/001039.html

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

[2003-06-15 23:08:05] [EMAIL PROTECTED]

It also crashes:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (runnable)]
0x40678cd9 in __strtod_internal (nptr=0x8ad63ec "SCREEN",
endptr=0xbfe0225c, group=0) at strtod.c:419
(gdb) bt
#0  0x40678cd9 in __strtod_internal (nptr=0x8ad63ec "SCREEN",
endptr=0xbfe0225c, group=0) at strtod.c:419
#1  0x4067dc59 in strtod (nptr=0x8ad63ec "SCREEN", endptr=0xbfe0225c)
at strtod.c:1425
#2  0x82c5345 in is_numeric_string (str=0x8ad63ec "SCREEN", length=6,
lval=0xbfe022c8, dval=0xbfe022bc, 
    allow_errors=0 '\000') at
/usr/src/web/php/php4/Zend/zend_operators.h:94
#3  0x82c4ebe in zendi_smart_strcmp (result=0xbfe0242c, s1=0x8ad63ac,
s2=0x88a7764)
    at /usr/src/web/php/php4/Zend/zend_operators.c:1670
#4  0x82c3736 in compare_function (result=0xbfe0242c, op1=0x8ad63ac,
op2=0x88a7764)
    at /usr/src/web/php/php4/Zend/zend_operators.c:1137
#5  0x82c41a6 in is_equal_function (result=0xbfe0242c, op1=0x8ad63ac,
op2=0x88a7764)
    at /usr/src/web/php/php4/Zend/zend_operators.c:1285
#6  0x82dc798 in execute (op_array=0x88a60c8) at
/usr/src/web/php/php4/Zend/zend_execute.c:1931
#7  0x82bc741 in call_user_function_ex (function_table=0x85a7cb0,
object_pp=0x0, function_name=0x88a1744, 
    retval_ptr_ptr=0xbfe02c44, param_count=3, params=0x8ad6554,
no_separation=1, symbol_table=0x0)
    at /usr/src/web/php/php4/Zend/zend_execute_API.c:566
#8  0x82bbee7 in call_user_function (function_table=0x85a7cb0,
object_pp=0x88a0a58, function_name=0x88a1744, 
    retval_ptr=0x8ad6514, param_count=3, params=0xbfe02cdc) at
/usr/src/web/php/php4/Zend/zend_execute_API.c:408
#9  0x8261550 in xml_call_handler (parser=0x88a0a1c, handler=0x88a1744,
argc=3, argv=0xbfe02cdc)
    at /usr/src/web/php/php4/ext/xml/xml.c:377
#10 0x826207c in _xml_startElementHandler (userData=0x88a0a1c,
name=0x8ad6326 "SCREEN", attributes=0x88a0d08)
    at /usr/src/web/php/php4/ext/xml/xml.c:661

Diff betweeb 4.2.3 and 4.3.3-dev ext/xml doesn't give any significant
changes, so it must be something else that has changed and just hasn't
been changed also in ext/xml, call_user_function() maybe?


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

[2003-06-15 22:35:36] [EMAIL PROTECTED]

Works fine with PHP 4.2.3, breaks with 4.3.1, 4.3.2, 4.3.3-dev.


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

[2003-06-04 13:43:11] derek at hostopia dot com

Here as requested is an example which works fine under 4.2.2, and
causes an endless loop in 4.3.2:


<!-- BEGIN XML FILE:  shapes.xml -->

<SCREEN>
  <INFO>This will render a random surprise shape</INFO>
  <RANDOM shapes="SQUARE TRIANGLE CIRCLE"/>
</SCREEN>

<!-- END XML FILE -->


### CUT HERE ###


<!-- BEGIN PHP FILE:  shapes.php -->

<?php
$file = "shapes.xml";

function startElement($parser, $name, $attribs) {
    switch ($name)
    {
        case "RANDOM":
            $list = explode(" ", $attribs["SHAPES"]);
            $num = count($list);
            $rnd = rand(1, $num) - 1;
            $xml = "<" . $list[$rnd] . "/>";
            if ( !xml_parse($parser, $xml) )
            {
                print xml_error_string(xml_get_error_code($parser));
            }
            break;
        case "SQUARE":
            print "\n       ################\n";
            print "       ################\n";
            print "       ################\n";
            print "       ################\n";
            print "       ################\n";
            print "       ################\n";
            print "       ################\n";
            print "       ################\n";
            break;
        case "TRIANGLE":
            print "\n              ##       \n";
            print "             ####      \n";
            print "            ######     \n";
            print "           ########    \n";
            print "          ##########   \n";
            print "         ############  \n";
            print "        ############## \n";
            print "       ################\n";
            break;
        case "CIRCLE":
            print "\n           ########    \n";
            print "         ############  \n";
            print "        ############## \n";
            print "        ############## \n";
            print "        ############## \n";
            print "        ############## \n";
            print "         ############  \n";
            print "           ########    \n";
            break;
    }
}
function endElement($parser, $name) {
}

function characterData($parser, $data) {
    print "<b>$data</b>";
}

function defaultHandler($parser, $data) {
    if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
        printf('<font color="#aa00aa">%s</font>',
            htmlspecialchars($data));
    } else {
        printf('<font size="-1">%s</font>',
            htmlspecialchars($data));
    }
}

function new_xml_parser($file) {
    global $parser_file;

    $xml_parser = xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
    xml_set_element_handler($xml_parser, "startElement",
"endElement");
    xml_set_character_data_handler($xml_parser, "characterData");
    xml_set_default_handler($xml_parser, "defaultHandler");

    if (!($fp = @fopen($file, "r"))) {
        return false;
    }
    if (!is_array($parser_file)) {
        settype($parser_file, "array");
    }
    $parser_file[$xml_parser] = $file;
    return array($xml_parser, $fp);
}

if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
    die("could not open XML input");
}

print "<pre>";
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d\n",
            xml_error_string(xml_get_error_code($xml_parser)),
            xml_get_current_line_number($xml_parser)));
    }
}
print "</pre>";
print "parse complete\n";
xml_parser_free($xml_parser);

?>

<!-- END PHP FILE -->

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

[2003-06-03 22:16:21] [EMAIL PROTECTED]

Please provide a short but complete example script.


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

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/24002

-- 
Edit this bug report at http://bugs.php.net/?id=24002&edit=1

Reply via email to