From 18151f1aa126b8c930506907685e7fed7b4ea9f0 Mon Sep 17 00:00:00 2001 From: msv Date: Fri, 29 Apr 2016 19:31:13 +0300 Subject: [PATCH] 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. --- src/LDOM/LDOM_XmlReader.cxx | 15 ++++++++++++++- src/PCDM/PCDM_ReadWriter.cxx | 8 ++++++-- tests/bugs/caf/bug27454 | 19 +++++++++++++++++++ tests/bugs/caf/bug27454_1 | 16 ++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 tests/bugs/caf/bug27454 create mode 100644 tests/bugs/caf/bug27454_1 diff --git a/src/LDOM/LDOM_XmlReader.cxx b/src/LDOM/LDOM_XmlReader.cxx index 18e17cec7c..0655a9a511 100644 --- a/src/LDOM/LDOM_XmlReader.cxx +++ b/src/LDOM/LDOM_XmlReader.cxx @@ -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; } } diff --git a/src/PCDM/PCDM_ReadWriter.cxx b/src/PCDM/PCDM_ReadWriter.cxx index 1af94f1247..8ce4da3273 100644 --- a/src/PCDM/PCDM_ReadWriter.cxx +++ b/src/PCDM/PCDM_ReadWriter.cxx @@ -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); diff --git a/tests/bugs/caf/bug27454 b/tests/bugs/caf/bug27454 new file mode 100644 index 0000000000..e146f3b6bb --- /dev/null +++ b/tests/bugs/caf/bug27454 @@ -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" +} \ No newline at end of file diff --git a/tests/bugs/caf/bug27454_1 b/tests/bugs/caf/bug27454_1 new file mode 100644 index 0000000000..f146be3130 --- /dev/null +++ b/tests/bugs/caf/bug27454_1 @@ -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 -- 2.20.1