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