1
0
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:
msv 2016-04-29 19:31:13 +03:00 committed by bugmaster
parent 15a954deb5
commit 18151f1aa1
4 changed files with 55 additions and 3 deletions

View File

@ -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;
}
}

View File

@ -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
View 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
View 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