Bug #18376: After an abitrary number of nodes DOMXML dies on large XML documents
| From: | watford at uiuc dot edu | Date: | Tue, 16 Jul 2002 20:02:11 +0000 |
| Subject: | Bug #18376: After an abitrary number of nodes DOMXML dies on large XML documents | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-14338@lists.php.net to get a copy of this message | ||
From: watford@uiuc.edu
Operating system: Windows 2000 Pro
PHP version: 4.2.1
PHP Bug Type: DOM XML related
Bug description: After an abitrary number of nodes DOMXML dies on large XML documents
When I run my script that parses a DOMXML Object into smaller more
managable objects, it will die on long XML documents [40+ elements] with
the error: Unhanded exception in Apache.exe (PHP4TS.DLL): 0xC0000005:
Access Violation. The Apache version is 2.0.36, and I have yet to try
this with the 1.3.X branch of Apache. Here is the output from PHP4TS.DLL
where it died:
006A6391 mov esi,dword ptr [esp+8]
006A6395 mov eax,dword ptr [esi]
-> 006A6397 dec word ptr [eax+0Ah]
006A639B mov eax,dword ptr [esi]
006A639D mov cx,word ptr [eax+0Ah]
006A63A1 test cx,cx
Here is my PHP Script:
<?php
class xmlNodeProperties
{
function xmlNodeProperties(/*void*/)
{ }
/*String*/ function getAttribute(/*String*/ $key)
{ return $this->$key; }
/*void*/ function setAttribute(/*String*/ $key, /*String*/ $val)
{ $this->$key = $val; }
}
class xmlNode extends xmlNodeProperties
{
var /*String*/ $nodeName;
var /*String*/ $cdata;
var /*xmlNode[]*/ $childNodes;
function xmlNode(/*void*/)
{
$this->xmlNodeProperties();
}
}
class CXMLParser
{
var /*xmlNode*/ $root;
function CXMLParser(/*void*/)
{
if(!$this->use_file) {
/*domxmlTree*/ $t = xmltree($this->xml_str);
$this->xml_str = "";
} else {
/*domxmlTree*/ $t = xmltree(domxml_dump_mem(xmldocfile($this->file)));
}
$this->root = new xmlNode();
$this->root->cdata = $this->get_cdata($t->children[0]);
$this->root->nodeName = $t->children[0]->tagname;
foreach($t->children[0]->attributes as /*domxmlNode*/ $a)
{
$this->root->setAttribute($a->name, $a->value);
}
foreach($t->children[0]->children as /*domxmlNode*/ $c)
{
/*xmlNode*/ $n = $this->parse($c);
if($n === false) { }
else {
$this->root->childNodes[] = $n;
}
}
}
/*xmlNode*/ function parse(/*domxmlNode*/ $domnode)
{
if($domnode->type != 1) return false;
/*xmlNode*/ $node = new xmlNode();
$node->cdata = $this->get_cdata($domnode);
$node->nodeName = $domnode->tagname;
foreach($domnode->attributes as /*domxmlNode*/ $a)
{
$node->setAttribute($a->name, $a->value);
}
foreach($domnode->children as /*domxmlNode*/ $c)
{
/*xmlNode*/ $n = $this->parse($c);
if($n === false) { }
else {
$node->childNodes[] = $n;
}
}
return $node;
}
/*String*/ function get_cdata(/*domxmlNode*/ $node)
{
foreach($node->children as /*domxmlNode*/ $c)
{
if($c->type == 3)
{
return $c->content;
}
}
return "";
}
}
class CXMLDocument extends CXMLParser
{
var /*String*/ $file;
var /*String*/ $xml_str;
var /*int*/ $use_file;
function CXMLDocument(/*...*/)
{
/*Array*/ $arglist = func_get_args();
if( !count($arglist) ) {
$this->xml_str = "";
$this->file = "";
$this->use_file = 0;
} else if( count($arglist) < 2 ) {
$this->xml_str = $arglist[0];
$this->file = "";
$this->use_file = 0;
} else {
$this->file = $arglist[0];
$this->use_file = $arglist[1];
if(file_exists($this->file)) {
/*domxmlDocument*/ $d = domxml_open_file($this->file);
if($d === false) { die("bad xml file"); }
} else {
die("bad file name or file does not exist");
}
}
$this->CXMLParser();
}
}
$xmlDoc = new CXMLDocument('
<columns>
<date name="Adv_Plan">Advanced Planning Meeting</date>
<date name="Rec_Pre_EUP">Receive Preliminary EUP</date>
<date name="Start_Prel_FC">Start Preliminary Fuel Cycle</date>
<date name="Send_Prel_FC">Send Preliminary Fuel Cycle</date>
<date name="Rec_Rel_EUP">Receive Release EUP</date>
<date name="Start_Rel_FC">Start Release Fuel Cycle</date>
<date name="Send_Rel_FC" important="1">Send Release Fuel
Cycle</date>
<date name="Send_Start_Rep" important="1">Send Startup
Report</date>
<date name="Final_eWA">Final eWA</date>
<date name="LicKickoff">Licensing Kickoff Meeting</date>
<date name="Mini_Review">Mini Review</date>
<date name="Send_Dft_FRED">Send Draft FRED</date>
<date name="Send_Dft_OPL">Send Draft OPL</date>
<date name="Rec_FRED">Receive Customer FRED</date>
<date name="SEND_OPL" allcaps="1">Send Customer OPL3</date>
<date name="Rec_OPL">Receive Customer OPL3</date>
<date name="SEND_FRED" allcaps="1">Send Customer FRED</date>
<date name="Download">Download to Manufacturing</date>
<date name="RLP">RLP</date>
<date name="SR1" important="1">SLMCPR</date>
<date name="Send_Drf_SRLR">Send Draft SRLR</date>
<date name="Rec_Comments_SRLR">Recieve Comments on SRLR</date>
<date name="Send_Final_SRLR" important="1">Send Final SRLR</date>
<date name="SEND_PREL_PCDB" allcaps="1">Send Preliminary
PCDB</date>
<date name="PCDB" important="1">Send Final PCDB</date>
<date name="CMR" important="1">Send CMR</date>
<date name="SEND_CMR1" allcaps="1">Send CMR Revision 1</date>
<date name="SEND_CMR2" allcaps="1">Send CMR Revision 2</date>
<date name="Rec_Cus_EOC">Receive Customer EOC Data</date>
<date name="SR2">Special Requirements 1</date>
<date name="SR3">Special Requirements 2</date>
<date name="SR4">Special Requirements 3</date>
<date name="SR5">Special Requirements 4</date>
<date name="Eigen_Rev">Eigenvalue Review</date>
<date name="FSDD">FSDD</date>
<date name="Loca_TSD">LOCA TSD</date>
<date name="Loca_Data">LOCA Interface Data</date>
<date name="Loca_Start">Start LOCA Analysis</date>
<date name="Loca_Fin">Complete LOCA Analysis</date>
<date name="Stab_TSD">Stability TSD</date>
<date name="Stab_Data">Stability Interface Data</date>
<date name="Stab_Start">Start Stability Analysis</date>
<date name="Stab_Fin">Complete Stability Analysis</date>
<date name="Trans_TSD">Transient TSD</date>
<date name="TRANS_DATA" allcaps="1">Transient Interface Data</date>
<date name="Trans_Sel_Rev">Transient Selection Review</date>
<date name="Trans_Start">Start Transient Analysis</date>
<date name="Trans_Fin">Complete Transient Analysis</date>
<date name="TRANS_WRAPUP" allcaps="1">Transient Wrapups</date>
<date name="BNDL_REP" allcaps="1">Bundle Announcement Report</date>
<date name="CMIT" allcaps="1">CMIT</date>
<date name="SEND_OPL7" allcaps="1">Send OPL7</date>
<date name="REC_OPL7" allcaps="1">Recieve Customer OPL7</date>
<date name="RES_OPL7" allcaps="1">Resolved OPL7</date>
<date name="SEND_OPL4" allcaps="1">Send Customer OPL4</date>
<date name="REC_OPL4" allcaps="1">Receive Customer OPL4</date>
</columns>');
?>
--
Edit bug report at http://bugs.php.net/?id=18376&edit=1
--
Fixed in CVS: http://bugs.php.net/fix.php?id=18376&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=18376&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=18376&r=needtrace
Try newer version: http://bugs.php.net/fix.php?id=18376&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=18376&r=support
Expected behavior: http://bugs.php.net/fix.php?id=18376&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=18376&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=18376&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=18376&r=globals