Salome HOME
Fix SIGSEGV of computing a quadratic sub-mesh
authoreap <eap@opencascade.com>
Thu, 19 Jul 2018 12:58:11 +0000 (15:58 +0300)
committereap <eap@opencascade.com>
Thu, 19 Jul 2018 12:58:11 +0000 (15:58 +0300)
src/NETGENPlugin/NETGENPlugin_Mesher.cxx

index a2f6469f40a63f6f08128631c0c0a5334ce57c77..f6831505b08ea28fa9e30d22c353c3add21e264b 100644 (file)
@@ -325,7 +325,7 @@ void NETGENPlugin_Mesher::SetParameters(const NETGENPlugin_Hypothesis* hyp)
           aSObj->UnRegister();
         }
         TopoDS_Shape S = smeshGen_i->GeomObjectToShape( aGeomObj.in() );
-       ::SetLocalSize(S, val);
+        ::SetLocalSize(S, val);
       }
     }
   }
@@ -3310,9 +3310,19 @@ bool NETGENPlugin_Mesher::Compute()
     FillSMesh( occgeo, *_ngMesh, initState, *_mesh, nodeVec, comment, &quadHelper );
 
     if ( quadHelper.GetIsQuadratic() ) // remove free nodes
+    {
       for ( size_t i = 0; i < nodeVec.size(); ++i )
         if ( nodeVec[i] && nodeVec[i]->NbInverseElements() == 0 )
+        {
           _mesh->GetMeshDS()->RemoveFreeNode( nodeVec[i], 0, /*fromGroups=*/false );
+          nodeVec[i]=0;
+        }
+      for ( size_t i = nodeVec.size()-1; i > 0; --i ) // remove trailing removed nodes
+        if ( !nodeVec[i] )
+          nodeVec.resize( i );
+        else
+          break;
+    }
   }
   SMESH_ComputeErrorPtr readErr = ReadErrors(nodeVec);
   if ( readErr && readErr->HasBadElems() )