mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-04 13:13:25 +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)
|
else if (myTagPerStep && aHasRead)
|
||||||
{
|
{
|
||||||
|
// in myTagPerStep mode, we should parse the buffer to the end before
|
||||||
|
// getting more characters from the stream.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -225,6 +227,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
|||||||
aState = STATE_TEXT;
|
aState = STATE_TEXT;
|
||||||
aStartData = myPtr;
|
aStartData = myPtr;
|
||||||
myPtr = myEndPtr;
|
myPtr = myEndPtr;
|
||||||
|
aHasRead = Standard_False;
|
||||||
} // end of checking in STATE_WAITING
|
} // end of checking in STATE_WAITING
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -244,6 +247,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
|||||||
return XML_HEADER;
|
return XML_HEADER;
|
||||||
}
|
}
|
||||||
myPtr = myEndPtr - 1;
|
myPtr = myEndPtr - 1;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Checking the characters in STATE_DOCTYPE, seek for "]>" sequence
|
// 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;
|
myPtr = myEndPtr - 1;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
state_doctype_markup:
|
state_doctype_markup:
|
||||||
@ -282,6 +287,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
|||||||
return XML_DOCTYPE;
|
return XML_DOCTYPE;
|
||||||
}
|
}
|
||||||
myPtr = myEndPtr - 1;
|
myPtr = myEndPtr - 1;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Checking the characters in STATE_COMMENT, seek for "-->" sequence
|
// 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;
|
myPtr = myEndPtr - 2;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Checking the characters in STATE_TEXT, seek for "<"
|
// Checking the characters in STATE_TEXT, seek for "<"
|
||||||
@ -316,6 +323,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
|||||||
return XML_TEXT;
|
return XML_TEXT;
|
||||||
}
|
}
|
||||||
myPtr = myEndPtr;
|
myPtr = myEndPtr;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Checking the characters in STATE_CDATA, seek for "]]"
|
// Checking the characters in STATE_CDATA, seek for "]]"
|
||||||
@ -334,6 +342,7 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStr
|
|||||||
return XML_CDATA;
|
return XML_CDATA;
|
||||||
}
|
}
|
||||||
myPtr = myEndPtr - 1;
|
myPtr = myEndPtr - 1;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Checking the characters in STATE_ELEMENT, seek the end of TagName
|
// Checking the characters in STATE_ELEMENT, seek the end of TagName
|
||||||
@ -489,8 +498,11 @@ attr_name:
|
|||||||
myPtr = aPtr + 1;
|
myPtr = aPtr + 1;
|
||||||
aStartData = NULL;
|
aStartData = NULL;
|
||||||
aState = STATE_ATTRIBUTE_NAME;
|
aState = STATE_ATTRIBUTE_NAME;
|
||||||
} else
|
}
|
||||||
|
else {
|
||||||
myPtr = myEndPtr;
|
myPtr = myEndPtr;
|
||||||
|
aHasRead = Standard_False;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Checking the characters in STATE_ELEMENT_END, seek for ">"
|
// Checking the characters in STATE_ELEMENT_END, seek for ">"
|
||||||
@ -504,6 +516,7 @@ attr_name:
|
|||||||
return XML_END_ELEMENT;
|
return XML_END_ELEMENT;
|
||||||
}
|
}
|
||||||
myPtr = myEndPtr;
|
myPtr = myEndPtr;
|
||||||
|
aHasRead = Standard_False;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -166,12 +166,16 @@ TCollection_ExtendedString PCDM_ReadWriter::FileFormat (Standard_IStream& theISt
|
|||||||
{
|
{
|
||||||
TCollection_ExtendedString aFormat;
|
TCollection_ExtendedString aFormat;
|
||||||
|
|
||||||
Storage_BaseDriver* aFileDriver;
|
Storage_BaseDriver* aFileDriver = 0L;
|
||||||
if (PCDM::FileDriverType (theIStream, aFileDriver) == PCDM_TOFD_XmlFile)
|
if (PCDM::FileDriverType (theIStream, aFileDriver) == PCDM_TOFD_XmlFile)
|
||||||
{
|
{
|
||||||
return ::TryXmlDriverType (theIStream);
|
return ::TryXmlDriverType (theIStream);
|
||||||
}
|
}
|
||||||
|
if (!aFileDriver)
|
||||||
|
{
|
||||||
|
// type is not recognized, return empty string
|
||||||
|
return aFormat;
|
||||||
|
}
|
||||||
|
|
||||||
aFileDriver->ReadCompleteInfo (theIStream, theData);
|
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