0029574: Protection of attributes retrieval against zero ID in Ocaf XML.
authorszy <szy@opencascade.com>
Mon, 19 Mar 2018 15:43:04 +0000 (18:43 +0300)
committerbugmaster <bugmaster@opencascade.com>
Tue, 10 Apr 2018 13:07:02 +0000 (16:07 +0300)
//Impacts attributes supporting user defined IDs.

src/XmlMDataStd/XmlMDataStd_BooleanArrayDriver.cxx
src/XmlMDataStd/XmlMDataStd_BooleanListDriver.cxx
src/XmlMDataStd/XmlMDataStd_ByteArrayDriver.cxx
src/XmlMDataStd/XmlMDataStd_ExtStringArrayDriver.cxx
src/XmlMDataStd/XmlMDataStd_ExtStringListDriver.cxx
src/XmlMDataStd/XmlMDataStd_IntegerArrayDriver.cxx
src/XmlMDataStd/XmlMDataStd_IntegerDriver.cxx
src/XmlMDataStd/XmlMDataStd_IntegerListDriver.cxx
src/XmlMDataStd/XmlMDataStd_NameDriver.cxx
src/XmlMDataStd/XmlMDataStd_ReferenceArrayDriver.cxx
src/XmlMDataStd/XmlMDataStd_ReferenceListDriver.cxx

index c2cd22d..51e2788 100644 (file)
@@ -93,13 +93,22 @@ Standard_Boolean XmlMDataStd_BooleanArrayDriver::Paste(const XmlObjMgt_Persisten
   }
 
   Handle(TDataStd_BooleanArray) aBooleanArray = Handle(TDataStd_BooleanArray)::DownCast(theTarget);
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_BooleanArray::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+  aBooleanArray->SetID(aGUID);
+
   aBooleanArray->Init(aFirstInd, aLastInd);
   Standard_Integer length = aLastInd - aFirstInd + 1;
   Handle(TColStd_HArray1OfByte) hArr = new TColStd_HArray1OfByte(0, length >> 3);
   TColStd_Array1OfByte& arr = hArr->ChangeArray1();
-
   Standard_Integer i = 0, upper = arr.Upper();
   Standard_CString aValueStr = Standard_CString(XmlObjMgt::GetStringValue(anElement).GetString());
+
   for (; i <= upper; i++)
   {
     if (!XmlObjMgt::GetInteger(aValueStr, aValue)) 
@@ -108,21 +117,13 @@ Standard_Boolean XmlMDataStd_BooleanArrayDriver::Paste(const XmlObjMgt_Persisten
         TCollection_ExtendedString("Cannot retrieve integer member"
         " for BooleanArray attribute as \"")
         + aValueStr + "\"";
-      myMessageDriver->Send (aMessageString, Message_Fail);
-      return Standard_False;
+      myMessageDriver->Send (aMessageString, Message_Warning);
+      aValue = 0;
     }
     arr.SetValue(i, (Standard_Byte) aValue);
   }
   aBooleanArray->SetInternalArray(hArr);
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_BooleanArray::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-  aBooleanArray->SetID(aGUID);
   return Standard_True;
 }
 
index c4c22da..cbcbd16 100644 (file)
@@ -85,19 +85,29 @@ Standard_Boolean XmlMDataStd_BooleanListDriver::Paste(const XmlObjMgt_Persistent
   }
 
   const Handle(TDataStd_BooleanList) aBooleanList = Handle(TDataStd_BooleanList)::DownCast(theTarget);
+
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_BooleanList::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+
+  aBooleanList->SetID(aGUID);
+
   if(aLastInd == 0) aFirstInd = 0;
   if (aFirstInd == aLastInd && aLastInd > 0) 
   {
-    Standard_Integer anInteger;
-    if (!XmlObjMgt::GetStringValue(anElement).GetInteger(anInteger)) 
+    if (!XmlObjMgt::GetStringValue(anElement).GetInteger(aValue)) 
     {
       TCollection_ExtendedString aMessageString =
         TCollection_ExtendedString("Cannot retrieve integer member"
                                    " for BooleanList attribute as \"");
-      myMessageDriver->Send (aMessageString, Message_Fail);
-      return Standard_False;
+      myMessageDriver->Send (aMessageString, Message_Warning);
+      aValue = 0;
     }
-    aBooleanList->Append(anInteger ? Standard_True : Standard_False);
+    aBooleanList->Append(aValue ? Standard_True : Standard_False);
   }
   else if(aLastInd >= 1)
   {
@@ -110,23 +120,13 @@ Standard_Boolean XmlMDataStd_BooleanListDriver::Paste(const XmlObjMgt_Persistent
           TCollection_ExtendedString("Cannot retrieve integer member"
                                      " for BooleanList attribute as \"")
             + aValueStr + "\"";
-        myMessageDriver->Send (aMessageString, Message_Fail);
-        return Standard_False;
+        myMessageDriver->Send (aMessageString, Message_Warning);
+        aValue = 0;
       }
       aBooleanList->Append(aValue ? Standard_True : Standard_False);
     }
   }
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_BooleanList::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  aBooleanList->SetID(aGUID);
-
   return Standard_True;
 }
 
index 71eb244..3423e9a 100644 (file)
@@ -96,6 +96,17 @@ Standard_Boolean XmlMDataStd_ByteArrayDriver::Paste(const XmlObjMgt_Persistent&
 
 
   Handle(TDataStd_ByteArray) aByteArray = Handle(TDataStd_ByteArray)::DownCast(theTarget);
+  
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_ByteArray::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+
+  aByteArray->SetID(aGUID);
+
   Handle(TColStd_HArray1OfByte) hArr = new TColStd_HArray1OfByte(aFirstInd, aLastInd);
   TColStd_Array1OfByte& arr = hArr->ChangeArray1();
 
@@ -109,8 +120,8 @@ Standard_Boolean XmlMDataStd_ByteArrayDriver::Paste(const XmlObjMgt_Persistent&
         TCollection_ExtendedString("Cannot retrieve integer member"
                                    " for ByteArray attribute as \"")
                                    + aValueStr + "\"";
-      myMessageDriver->Send (aMessageString, Message_Fail);
-      return Standard_False;
+      myMessageDriver->Send (aMessageString, Message_Warning);
+      aValue = 0;
     }
     arr.SetValue(i, (Standard_Byte) aValue);
   }
@@ -138,16 +149,6 @@ Standard_Boolean XmlMDataStd_ByteArrayDriver::Paste(const XmlObjMgt_Persistent&
 #endif
   aByteArray->SetDelta(aDelta);
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_ByteArray::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  aByteArray->SetID(aGUID);
-
   return Standard_True;
 }
 
index d4f93ae..e66d198 100644 (file)
@@ -115,6 +115,16 @@ Standard_Boolean XmlMDataStd_ExtStringArrayDriver::Paste
     Handle(TDataStd_ExtStringArray)::DownCast(theTarget);
   aExtStringArray->Init(aFirstInd, aLastInd);
   
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_ExtStringArray::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+
+  aExtStringArray->SetID(aGUID);
+
   // Read string values.
   if ( !separator.Length() && anElement.hasChildNodes() )
   {
@@ -205,16 +215,6 @@ Standard_Boolean XmlMDataStd_ExtStringArrayDriver::Paste
 #endif
   aExtStringArray->SetDelta(aDelta);
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_ExtStringArray::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  aExtStringArray->SetID(aGUID);
-
   return Standard_True;
 }
 
index 0489eb8..c9685ad 100644 (file)
@@ -87,13 +87,22 @@ Standard_Boolean XmlMDataStd_ExtStringListDriver::Paste(const XmlObjMgt_Persiste
   }
 
   const Handle(TDataStd_ExtStringList) anExtStringList = Handle(TDataStd_ExtStringList)::DownCast(theTarget);
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_ExtStringList::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+
+  anExtStringList->SetID(aGUID);
+
   if(aLastInd > 0) {
     if (!anElement.hasChildNodes())
     {
       TCollection_ExtendedString aMessageString = 
         TCollection_ExtendedString("Cannot retrieve a list of extended strings");
-      myMessageDriver->Send (aMessageString, Message_Fail);
-      return Standard_False;
+      myMessageDriver->Send (aMessageString, Message_Warning);
     }
 
     LDOM_Node aCurNode = anElement.getFirstChild();
@@ -110,15 +119,6 @@ Standard_Boolean XmlMDataStd_ExtStringListDriver::Paste(const XmlObjMgt_Persiste
     XmlObjMgt::GetExtendedString( *aCurElement, aValueStr );
     anExtStringList->Append(aValueStr);
   }
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_ExtStringList::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  anExtStringList->SetID(aGUID);
 
   return Standard_True;
 }
index cad547b..9c5cc69 100644 (file)
@@ -89,16 +89,24 @@ Standard_Boolean XmlMDataStd_IntegerArrayDriver::Paste
     Handle(TDataStd_IntegerArray)::DownCast(theTarget);
   anIntArray->Init(aFirstInd, aLastInd);
 
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_IntegerArray::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+  anIntArray->SetID(aGUID);
+
   if(aFirstInd == aLastInd) {
-    Standard_Integer anInteger;
-    if(!XmlObjMgt::GetStringValue(anElement).GetInteger( anInteger)) {
+    if(!XmlObjMgt::GetStringValue(anElement).GetInteger( aValue)) {
       TCollection_ExtendedString aMessageString =
         TCollection_ExtendedString("Cannot retrieve integer member"
                                    " for IntegerArray attribute as \"");
-      myMessageDriver->Send (aMessageString, Message_Fail);
-      return Standard_False;
+      myMessageDriver->Send (aMessageString, Message_Warning);
+      aValue = 0;
     }
-    anIntArray->SetValue(aFirstInd, anInteger);
+    anIntArray->SetValue(aFirstInd, aValue);
     
   }
   else {
@@ -113,8 +121,8 @@ Standard_Boolean XmlMDataStd_IntegerArrayDriver::Paste
           TCollection_ExtendedString("Cannot retrieve integer member"
                                      " for IntegerArray attribute as \"")
             + aValueStr + "\"";
-        myMessageDriver->Send (aMessageString, Message_Fail);
-        return Standard_False;
+        myMessageDriver->Send (aMessageString, Message_Warning);
+        aValue = 0;
       }
       anIntArray->SetValue(ind, aValue);
     }
@@ -141,16 +149,6 @@ Standard_Boolean XmlMDataStd_IntegerArrayDriver::Paste
 #endif
   anIntArray->SetDelta(aDelta);
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_IntegerArray::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  anIntArray->SetID(aGUID);
-
   return Standard_True;
 }
 
index 55a85b6..e5886d9 100644 (file)
@@ -58,8 +58,8 @@ Standard_Boolean XmlMDataStd_IntegerDriver::Paste
     TCollection_ExtendedString aMessageString =
       TCollection_ExtendedString("Cannot retrieve Integer attribute from \"")
         + anIntStr + "\"";
-    myMessageDriver->Send (aMessageString, Message_Fail);
-    return Standard_False;
+    myMessageDriver->Send (aMessageString, Message_Warning);
+    aValue = 0;
   }
 
   Handle(TDataStd_Integer) anInt= Handle(TDataStd_Integer)::DownCast(theTarget);
index fc13173..c0fb4b4 100644 (file)
@@ -85,19 +85,29 @@ Standard_Boolean XmlMDataStd_IntegerListDriver::Paste(const XmlObjMgt_Persistent
   }
 
   const Handle(TDataStd_IntegerList) anIntList = Handle(TDataStd_IntegerList)::DownCast(theTarget);
+  
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_IntegerList::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+
+  anIntList->SetID(aGUID);
+
   if(aLastInd == 0) aFirstInd = 0;
   if (aFirstInd == aLastInd && aLastInd > 0) 
   {
-    Standard_Integer anInteger;
-    if (!XmlObjMgt::GetStringValue(anElement).GetInteger(anInteger)) 
+    if (!XmlObjMgt::GetStringValue(anElement).GetInteger(aValue)) 
     {
       TCollection_ExtendedString aMessageString =
         TCollection_ExtendedString("Cannot retrieve integer member"
                                    " for IntegerList attribute as \"");
-      myMessageDriver->Send (aMessageString, Message_Fail);
-      return Standard_False;
+      myMessageDriver->Send (aMessageString, Message_Warning);
+      aValue = 0;
     }
-    anIntList->Append(anInteger);
+    anIntList->Append(aValue);
   }
   else if(aLastInd >= 1)
   {
@@ -110,23 +120,13 @@ Standard_Boolean XmlMDataStd_IntegerListDriver::Paste(const XmlObjMgt_Persistent
           TCollection_ExtendedString("Cannot retrieve integer member"
                                      " for IntegerList attribute as \"")
             + aValueStr + "\"";
-        myMessageDriver->Send (aMessageString, Message_Fail);
-        return Standard_False;
+        myMessageDriver->Send (aMessageString, Message_Warning);
+        aValue = 0;
       }
       anIntList->Append(aValue);
     }
   }
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_IntegerList::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  anIntList->SetID(aGUID);
-
   return Standard_True;
 }
 
index a558391..37649cb 100644 (file)
@@ -53,11 +53,11 @@ Standard_Boolean XmlMDataStd_NameDriver::Paste
                                 const Handle(TDF_Attribute)& theTarget,
                                 XmlObjMgt_RRelocationTable&  ) const
 {
-  if(!theTarget.IsNull()) {    
+  if(!theTarget.IsNull()) {
     TCollection_ExtendedString aString;
     if (XmlObjMgt::GetExtendedString (theSource, aString))
     {
-      Handle(TDataStd_Name)::DownCast(theTarget) -> Set (aString);    
+      Handle(TDataStd_Name)::DownCast(theTarget) -> Set (aString);
       // attribute id
       Standard_GUID aGUID;
       const XmlObjMgt_Element& anElement = theSource;
@@ -68,7 +68,7 @@ Standard_Boolean XmlMDataStd_NameDriver::Paste
         aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
 
       Handle(TDataStd_Name)::DownCast(theTarget)->SetID(aGUID);
-         return Standard_True;
+      return Standard_True;
     }
   }
   myMessageDriver->Send("error retrieving ExtendedString for type TDataStd_Name", Message_Fail);
index 0a84561..85b880f 100644 (file)
@@ -89,6 +89,16 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
   Handle(TDataStd_ReferenceArray) aReferenceArray = Handle(TDataStd_ReferenceArray)::DownCast(theTarget);
   aReferenceArray->Init(aFirstInd, aLastInd);
   
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_ReferenceArray::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+
+  aReferenceArray->SetID(aGUID);
+
   if (!anElement.hasChildNodes())
   {
     TCollection_ExtendedString aMessageString = 
@@ -153,16 +163,6 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
   }
   aReferenceArray->SetValue(i, tLab);
 
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_ReferenceArray::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  aReferenceArray->SetID(aGUID);
-
   return Standard_True;
 }
 
index e6ffe53..b69e890 100644 (file)
@@ -88,6 +88,15 @@ Standard_Boolean XmlMDataStd_ReferenceListDriver::Paste(const XmlObjMgt_Persiste
   }
 
   const Handle(TDataStd_ReferenceList) aReferenceList = Handle(TDataStd_ReferenceList)::DownCast(theTarget);
+  // attribute id
+  Standard_GUID aGUID;
+  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
+  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
+    aGUID = TDataStd_ReferenceList::GetID(); //default case
+  else
+    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
+  aReferenceList->SetID(aGUID);
+
   if(aLastInd > 0) {
     if (!anElement.hasChildNodes())
     {
@@ -151,15 +160,6 @@ Standard_Boolean XmlMDataStd_ReferenceListDriver::Paste(const XmlObjMgt_Persiste
   }
   aReferenceList->Append(tLab);
   }
-  // attribute id
-  Standard_GUID aGUID;
-  XmlObjMgt_DOMString aGUIDStr = anElement.getAttribute(::AttributeIDString());
-  if (aGUIDStr.Type() == XmlObjMgt_DOMString::LDOM_NULL)
-    aGUID = TDataStd_ReferenceList::GetID(); //default case
-  else
-    aGUID = Standard_GUID(Standard_CString(aGUIDStr.GetString())); // user defined case
-
-  aReferenceList->SetID(aGUID);
 
   return Standard_True;
 }