Salome HOME
Fix CRASH after mesh.RemoveGroupWithContents( group_of_other_mesh )
authoreap <eap@opencascade.com>
Mon, 8 Apr 2019 10:40:11 +0000 (13:40 +0300)
committereap <eap@opencascade.com>
Mon, 8 Apr 2019 10:40:11 +0000 (13:40 +0300)
src/SMDS/SMDS_ElementFactory.cxx
src/SMESHUtils/SMESH_Offset.cxx
src/SMESH_I/SMESH_Mesh_i.cxx

index 41018a0d9714e056992ab0b85ea631a936db3849..12b0f80b00ef3d049fb6012d9a2c52a60b7edab2 100644 (file)
@@ -239,6 +239,9 @@ int SMDS_ElementFactory::FromVtkToSmds( vtkIdType vtkID )
 
 void SMDS_ElementFactory::Free( const SMDS_MeshElement* e )
 {
+  if ( e != FindElement( e->GetID() ))
+    SALOME_Exception("SMDS_ElementFactory::Free(): element of other mesh");
+
   if ( !myVtkIDs.empty() )
   {
     size_t    id = e->GetID() - 1;
index 1b1f5204e179a0fbe31b1ba89975622e51419e4f..34e3c9d26bdd7991452a30c7ff4cc85884a86a64 100644 (file)
@@ -2391,8 +2391,9 @@ namespace
           // if ( !myLinks[i].IsInternal() )
           //   myLinks[ i ].myFace = cutterFace;
           // else
-          myLinks[ i   ].ReplaceCoplanar( newEdge );
-          myLinks[ i+1 ].ReplaceCoplanar( newEdge );
+          myLinks[ i ].ReplaceCoplanar( newEdge );
+          if ( myLinks[i].IsInternal() && i+1 < myLinks.size() )
+            myLinks[ i+1 ].ReplaceCoplanar( newEdge );
           return;
         }
         i += myLinks[i].IsInternal();
index 67daefbd06612cd62e45f4de421d39b4f8d7218e..c5a4ecd6e3d016b28e8dbe42b0604b93c1e63af1 100644 (file)
@@ -1104,6 +1104,10 @@ void SMESH_Mesh_i::RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup )
   if ( !aGroup )
     return;
 
+  if ( aGroup->GetMeshServant() != this )
+    THROW_SALOME_CORBA_EXCEPTION( "RemoveGroup(): group does not belong to this mesh",
+                                  SALOME::BAD_PARAM );
+
   SALOMEDS::SObject_wrap aGroupSO = _gen_i->ObjectToSObject( theGroup );
   if ( !aGroupSO->_is_nil() )
   {
@@ -1138,6 +1142,11 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup
   if ( theGroup->_is_nil() )
     return;
 
+  SMESH_GroupBase_i* groupImpl = SMESH::DownCast< SMESH_GroupBase_i* >( theGroup );
+  if ( !groupImpl || groupImpl->GetMeshServant() != this )
+    THROW_SALOME_CORBA_EXCEPTION( "RemoveGroupWithContents(): group does not belong to this mesh",
+                                  SALOME::BAD_PARAM);
+
   vector<int> nodeIds; // to remove nodes becoming free
   bool isNodal = ( theGroup->GetType() == SMESH::NODE );
   if ( !isNodal && !theGroup->IsEmpty() )