mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-07-30 13:05:50 +03:00
0027454: Application hangs while opening a non-OCAF XML file
1) Add protection against accessing null pointer in PCDM_ReadWriter::FileFormat. 2) In LDOM_XmlReader::ReadRecord, take into account that the character '>' can have no special meaning (e.g., in a text), and we must read the data behind this character to complete the current tag reading. This treatment concerns the mode of work when myTagPerStep is true. 3) Create a test case of reading of XML file not related to OCAF document. Test case was added.
This commit is contained in:
parent
15a954deb5
commit
18151f1aa1
@ -107,6 +107,8 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
}
|
||||
else if (myTagPerStep && aHasRead)
|
||||
{
|
||||
// in myTagPerStep mode, we should parse the buffer to the end before
|
||||
// getting more characters from the stream.
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -225,6 +227,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
aState = STATE_TEXT;
|
||||
aStartData = myPtr;
|
||||
myPtr = myEndPtr;
|
||||
aHasRead = Standard_False;
|
||||
} // end of checking in STATE_WAITING
|
||||
continue;
|
||||
|
||||
@ -244,6 +247,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
return XML_HEADER;
|
||||
}
|
||||
myPtr = myEndPtr - 1;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
|
||||
// Checking the characters in STATE_DOCTYPE, seek for "]>" sequence
|
||||
@ -264,6 +268,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
}
|
||||
}
|
||||
myPtr = myEndPtr - 1;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
|
||||
state_doctype_markup:
|
||||
@ -282,6 +287,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
return XML_DOCTYPE;
|
||||
}
|
||||
myPtr = myEndPtr - 1;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
|
||||
// Checking the characters in STATE_COMMENT, seek for "-->" sequence
|
||||
@ -303,6 +309,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
}
|
||||
}
|
||||
myPtr = myEndPtr - 2;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
|
||||
// Checking the characters in STATE_TEXT, seek for "<"
|
||||
@ -316,6 +323,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
return XML_TEXT;
|
||||
}
|
||||
myPtr = myEndPtr;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
|
||||
// Checking the characters in STATE_CDATA, seek for "]]"
|
||||
@ -334,6 +342,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
||||
return XML_CDATA;
|
||||
}
|
||||
myPtr = myEndPtr - 1;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
|
||||
// Checking the characters in STATE_ELEMENT, seek the end of TagName
|
||||
@ -489,8 +498,11 @@ attr_name:
|
||||
myPtr = aPtr + 1;
|
||||
aStartData = NULL;
|
||||
aState = STATE_ATTRIBUTE_NAME;
|
||||
} else
|
||||
}
|
||||
else {
|
||||
myPtr = myEndPtr;
|
||||
aHasRead = Standard_False;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// Checking the characters in STATE_ELEMENT_END, seek for ">"
|
||||
@ -504,6 +516,7 @@ attr_name:
|
||||
return XML_END_ELEMENT;
|
||||
}
|
||||
myPtr = myEndPtr;
|
||||
aHasRead = Standard_False;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -166,12 +166,16 @@ TCollection_ExtendedString PCDM_ReadWriter::FileFormat (Standard_IStream& theISt
|
||||
{
|
||||
TCollection_ExtendedString aFormat;
|
||||
|
||||
Storage_BaseDriver* aFileDriver;
|
||||
Storage_BaseDriver* aFileDriver = 0L;
|
||||
if (PCDM::FileDriverType (theIStream, aFileDriver) == PCDM_TOFD_XmlFile)
|
||||
{
|
||||
return ::TryXmlDriverType (theIStream);
|
||||
}
|
||||
|
||||
if (!aFileDriver)
|
||||
{
|
||||
// type is not recognized, return empty string
|
||||
return aFormat;
|
||||
}
|
||||
|
||||
aFileDriver->ReadCompleteInfo (theIStream, theData);
|
||||
|
||||
|
19
tests/bugs/caf/bug27454
Normal file
19
tests/bugs/caf/bug27454
Normal file
@ -0,0 +1,19 @@
|
||||
puts "REQUIRED All: DDocStd_Open : Error"
|
||||
|
||||
puts "========"
|
||||
puts "OCC27454"
|
||||
puts "========"
|
||||
puts ""
|
||||
###################################################
|
||||
## Application hangs while opening a non-OCAF XML file
|
||||
###################################################
|
||||
|
||||
cpulimit 10
|
||||
|
||||
catch {Open [locate_data_file bug27454_test.xml] D -stream} msg
|
||||
|
||||
cpulimit
|
||||
|
||||
if ![regexp {DDocStd_Open : Error} $msg] {
|
||||
puts "Error: reader did not report an error reading the file of unknown format"
|
||||
}
|
16
tests/bugs/caf/bug27454_1
Normal file
16
tests/bugs/caf/bug27454_1
Normal file
@ -0,0 +1,16 @@
|
||||
puts "========"
|
||||
puts "OCC27454"
|
||||
puts "========"
|
||||
puts ""
|
||||
###################################################
|
||||
## Application hangs while opening a non-OCAF XML file
|
||||
###################################################
|
||||
|
||||
if [info exists D] {unset D}
|
||||
Open [locate_data_file shape_tracking.ocaf.xml] D -stream
|
||||
|
||||
if {[dtyp D] != "TDocStd_Document"} {
|
||||
puts "Error: XML OCAF document read failure"
|
||||
}
|
||||
|
||||
Close D
|
Loading…
x
Reference in New Issue
Block a user