Salome HOME
23594: EDF 17213 : crash of salome when loading SMESH or dumping the study
authoreap <eap@opencascade.com>
Wed, 10 Oct 2018 14:11:35 +0000 (17:11 +0300)
committereap <eap@opencascade.com>
Wed, 10 Oct 2018 14:11:35 +0000 (17:11 +0300)
  Attempt 1:
  in SMESH_Mesh::SortByMeshOrder() assure same size of sortedPos and onlyOrderedList

src/SMESH/SMESH_Gen.cxx
src/SMESH/SMESH_Mesh.cxx
src/SMESHUtils/SMESH_Offset.cxx

index 574d4b3dedba14709fe847a3806a3c72378678d1..67c3edda9933cd8057ab5b4abcbced706b853803 100644 (file)
@@ -1032,13 +1032,13 @@ std::vector< std::string > SMESH_Gen::GetPluginXMLPaths()
       bool fileOK;
 #ifdef WIN32
 #ifdef UNICODE
-         const wchar_t* path = Kernel_Utils::decode_s(xmlPath);
+      const wchar_t* path = Kernel_Utils::decode_s(xmlPath);
 #else
-         const char* path = xmlPath.c_str();
+      const char* path = xmlPath.c_str();
 #endif
       fileOK = (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES);
 #ifdef UNICODE
-         delete path;
+      delete path;
 #endif
 #else
       fileOK = (access(xmlPath.c_str(), F_OK) == 0);
index 226800af21610bc9887940fddf84c0fd719e3d5e..e7acf1db4d60ec3e0b970637eadeef3e5e2b59bc 100644 (file)
@@ -2431,8 +2431,9 @@ bool SMESH_Mesh::SortByMeshOrder(std::vector<SMESH_subMesh*>& theListToSort) con
     {
       TPosInList smPos = find( smBeg, smEnd, smVec[i] );
       if ( smPos != smEnd ) {
-        onlyOrderedList.push_back( smVec[i] );
         sortedPos[ distance( smBeg, smPos )] = smPos;
+        if ( sortedPos.size() > onlyOrderedList.size() )
+          onlyOrderedList.push_back( smVec[i] );
       }
     }
   }
index 564a09f69d598112ead34121ae574f0edfbfd9f7..faefc439db2bb5716f2d4c571077b655d59a7cb7 100644 (file)
@@ -2656,6 +2656,11 @@ SMDS_Mesh* SMESH_MeshAlgos::MakeOffset( SMDS_ElemIteratorPtr theFaceIt,
                                         TEPairVec&           theNew2OldFaces,
                                         TNPairVec&           theNew2OldNodes)
 {
+  if ( theSrcMesh.GetMeshInfo().NbFaces( ORDER_QUADRATIC ) > 0 )
+    throw SALOME_Exception( "Offset of quadratic mesh not supported" );
+  if ( theSrcMesh.GetMeshInfo().NbFaces() > theSrcMesh.GetMeshInfo().NbTriangles() )
+    throw SALOME_Exception( "Offset of non-triangular mesh not supported" );
+
   SMDS_Mesh* newMesh = new SMDS_Mesh;
   theNew2OldFaces.clear();
   theNew2OldNodes.clear();
@@ -2663,11 +2668,6 @@ SMDS_Mesh* SMESH_MeshAlgos::MakeOffset( SMDS_ElemIteratorPtr theFaceIt,
     ( std::make_pair(( const SMDS_MeshElement*) 0,
                      ( const SMDS_MeshElement*) 0)); // to have index == face->GetID()
 
-  if ( theSrcMesh.GetMeshInfo().NbFaces( ORDER_QUADRATIC ) > 0 )
-    throw SALOME_Exception( "Offset of quadratic mesh not supported" );
-  if ( theSrcMesh.GetMeshInfo().NbFaces() > theSrcMesh.GetMeshInfo().NbTriangles() )
-    throw SALOME_Exception( "Offset of non-triangular mesh not supported" );
-
   // copy input faces to the newMesh keeping IDs of nodes
 
   double minNodeDist = 1e100;