From a4be05bc3b1de5753d74501144c3ff1416606a12 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 10 Oct 2018 17:11:35 +0300 Subject: [PATCH] 23594: EDF 17213 : crash of salome when loading SMESH or dumping the study Attempt 1: in SMESH_Mesh::SortByMeshOrder() assure same size of sortedPos and onlyOrderedList --- src/SMESH/SMESH_Gen.cxx | 6 +++--- src/SMESH/SMESH_Mesh.cxx | 3 ++- src/SMESHUtils/SMESH_Offset.cxx | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index 574d4b3de..67c3edda9 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -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); diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 226800af2..e7acf1db4 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -2431,8 +2431,9 @@ bool SMESH_Mesh::SortByMeshOrder(std::vector& 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] ); } } } diff --git a/src/SMESHUtils/SMESH_Offset.cxx b/src/SMESHUtils/SMESH_Offset.cxx index 564a09f69..faefc439d 100644 --- a/src/SMESHUtils/SMESH_Offset.cxx +++ b/src/SMESHUtils/SMESH_Offset.cxx @@ -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;