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] rrichards@php.net
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] sniper@php.net
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] sniper@php.net
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] sniper@php.net
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