]> OCCT Git - occt.git/commitdiff
0031310: Application Framework - A document with a reference array attribute crashes...
authorvro <vro@opencascade.com>
Tue, 21 Jan 2020 08:46:45 +0000 (11:46 +0300)
committerabv <abv@opencascade.com>
Sat, 12 Sep 2020 17:42:17 +0000 (20:42 +0300)
src/XmlMDataStd/XmlMDataStd_ReferenceArrayDriver.cxx

index 85b880f5ef3462fc635bfe8e3b598febc4d1a83b..e7b41a0b5e4f7957184f9b2748385cf068addec0 100644 (file)
@@ -117,26 +117,28 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
     if (aValueStr == NULL)
     {
       myMessageDriver->Send ("Cannot retrieve reference string from element", Message_Fail);
-      return Standard_False;
     }
-    TCollection_AsciiString anEntry;
-    if (XmlObjMgt::GetTagEntryString (aValueStr, anEntry) == Standard_False)
-    {
-      TCollection_ExtendedString aMessage =
-        TCollection_ExtendedString ("Cannot retrieve reference from \"")
-        + aValueStr + '\"';
-      myMessageDriver->Send (aMessage, Message_Fail);
-      return Standard_False;
-    }
-    // Find label by entry
-    TDF_Label tLab; // Null label.
-    if (anEntry.Length() > 0)
+    else
     {
-      TDF_Tool::Label(aReferenceArray->Label().Data(), anEntry, tLab, Standard_True);
+      TCollection_AsciiString anEntry;
+      if (XmlObjMgt::GetTagEntryString(aValueStr, anEntry) == Standard_False)
+      {
+        TCollection_ExtendedString aMessage =
+            TCollection_ExtendedString("Cannot retrieve reference from \"")
+            + aValueStr + '\"';
+        myMessageDriver->Send(aMessage, Message_Fail);
+        return Standard_False;
+      }
+      // Find label by entry
+      TDF_Label tLab; // Null label.
+      if (anEntry.Length() > 0)
+      {
+        TDF_Tool::Label(aReferenceArray->Label().Data(), anEntry, tLab, Standard_True);
+      }
+      aReferenceArray->SetValue(i++, tLab);
+      aCurNode = aCurElement->getNextSibling();
+      aCurElement = (LDOM_Element*)&aCurNode;
     }
-    aReferenceArray->SetValue(i++, tLab);
-    aCurNode = aCurElement->getNextSibling();
-    aCurElement = (LDOM_Element*)&aCurNode;
   }
 
   // Last reference
@@ -144,24 +146,26 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
   if (aValueStr == NULL)
   {
     myMessageDriver->Send ("Cannot retrieve reference string from element", Message_Fail);
-    return Standard_False;
   }
-  TCollection_AsciiString anEntry;
-  if (XmlObjMgt::GetTagEntryString (aValueStr, anEntry) == Standard_False)
-  {
-    TCollection_ExtendedString aMessage =
-      TCollection_ExtendedString ("Cannot retrieve reference from \"")
-      + aValueStr + '\"';
-    myMessageDriver->Send (aMessage, Message_Fail);
-    return Standard_False;
-  }
-  // Find label by entry
-  TDF_Label tLab; // Null label.
-  if (anEntry.Length() > 0)
+  else
   {
-    TDF_Tool::Label(aReferenceArray->Label().Data(), anEntry, tLab, Standard_True);
+    TCollection_AsciiString anEntry;
+    if (XmlObjMgt::GetTagEntryString(aValueStr, anEntry) == Standard_False)
+    {
+      TCollection_ExtendedString aMessage =
+          TCollection_ExtendedString("Cannot retrieve reference from \"")
+          + aValueStr + '\"';
+      myMessageDriver->Send(aMessage, Message_Fail);
+      return Standard_False;
+    }
+    // Find label by entry
+    TDF_Label tLab; // Null label.
+    if (anEntry.Length() > 0)
+    {
+      TDF_Tool::Label(aReferenceArray->Label().Data(), anEntry, tLab, Standard_True);
+    }
+    aReferenceArray->SetValue(i, tLab);
   }
-  aReferenceArray->SetValue(i, tLab);
 
   return Standard_True;
 }
@@ -192,11 +196,12 @@ void XmlMDataStd_ReferenceArrayDriver::Paste(const Handle(TDF_Attribute)& theSou
   
   for (Standard_Integer i = aL; i <= anU; i++)
   {
-    if (L.IsDescendant(aReferenceArray->Value(i).Root()))
+    const TDF_Label& label = aReferenceArray->Value(i);
+    if (!label.IsNull() && L.IsDescendant(label.Root()))
     {
       // Internal reference
       TCollection_AsciiString anEntry;
-      TDF_Tool::Entry(aReferenceArray->Value(i), anEntry);
+      TDF_Tool::Entry(label, anEntry);
 
       XmlObjMgt_DOMString aDOMString;
       XmlObjMgt::SetTagEntryString (aDOMString, anEntry);