1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-03 17:56:21 +03:00

0030133: Modeling Data - Crash during visualization of invalid part

Control of number of recursive calls is implemented to avoid stack overflow.
This commit is contained in:
ifv 2018-09-17 17:13:44 +03:00 committed by apn
parent 6997ff1c88
commit dcf0889fc2
3 changed files with 55 additions and 11 deletions

View File

@ -26,6 +26,8 @@
#include <Standard_OutOfRange.hxx>
#include <StdFail_NotDone.hxx>
static const Standard_Integer MyMaxQuasiFleshe = 2000;
// mask the return of a Adaptor2d_Curve2d as a gp_Pnt
static gp_Pnt Value(const Adaptor3d_Curve & C,
const Standard_Real Parameter)

View File

@ -25,6 +25,7 @@
#include <gp_Circ2d.hxx>
#include <Precision.hxx>
static void QuasiFleche(const TheCurve&,
const Standard_Real,
const Standard_Real,
@ -36,7 +37,8 @@ static void QuasiFleche(const TheCurve&,
const Standard_Integer,
const Standard_Real,
TColStd_SequenceOfReal&,
TColgp_SequenceOfPnt&);
TColgp_SequenceOfPnt&,
Standard_Integer&);
static void QuasiFleche(const TheCurve&,
const Standard_Real,
@ -46,7 +48,8 @@ static void QuasiFleche(const TheCurve&,
const gp_Pnt&,
const Standard_Integer,
TColStd_SequenceOfReal&,
TColgp_SequenceOfPnt&);
TColgp_SequenceOfPnt&,
Standard_Integer&);
//=======================================================================
@ -145,6 +148,7 @@ static Standard_Boolean PerformCurve (TColStd_SequenceOfReal& Parameters,
const GeomAbs_Shape Continuity)
{
Standard_Integer Nbmin = 2;
Standard_Integer aNbCallQF = 0;
gp_Pnt Pdeb;
if (Continuity <= GeomAbs_G1)
@ -159,7 +163,7 @@ static Standard_Boolean PerformCurve (TColStd_SequenceOfReal& Parameters,
U1, Pdeb,
U2, Pfin,
Nbmin,
Parameters, Points);
Parameters, Points, aNbCallQF);
}
else
{
@ -178,7 +182,7 @@ static Standard_Boolean PerformCurve (TColStd_SequenceOfReal& Parameters,
Dfin,
Nbmin,
EPSILON * EPSILON,
Parameters, Points);
Parameters, Points, aNbCallQF);
}
// cout << "Nb de pts: " << Points.Length()<< endl;
return Standard_True;
@ -338,9 +342,19 @@ void QuasiFleche (const TheCurve& C,
const Standard_Integer Nbmin,
const Standard_Real Eps,
TColStd_SequenceOfReal& Parameters,
TColgp_SequenceOfPnt& Points)
TColgp_SequenceOfPnt& Points,
Standard_Integer& theNbCalls)
{
theNbCalls++;
if (theNbCalls >= MyMaxQuasiFleshe)
{
return;
}
Standard_Integer Ptslength = Points.Length();
if (theNbCalls > 100 && Ptslength < 2)
{
return;
}
Standard_Real Udelta = Ufin - Udeb;
gp_Pnt Pdelta;
gp_Vec Vdelta;
@ -393,7 +407,7 @@ void QuasiFleche (const TheCurve& C,
Vdelta,
3,
Eps,
Parameters, Points);
Parameters, Points, theNbCalls);
}
if (Nbmin > 2)
@ -404,8 +418,9 @@ void QuasiFleche (const TheCurve& C,
Vfin,
Nbmin - (Points.Length() - Ptslength),
Eps,
Parameters, Points);
Parameters, Points, theNbCalls);
}
theNbCalls--;
}
@ -421,9 +436,19 @@ void QuasiFleche (const TheCurve& C,
const gp_Pnt& Pfin,
const Standard_Integer Nbmin,
TColStd_SequenceOfReal& Parameters,
TColgp_SequenceOfPnt& Points)
TColgp_SequenceOfPnt& Points,
Standard_Integer& theNbCalls)
{
theNbCalls++;
if (theNbCalls >= MyMaxQuasiFleshe)
{
return;
}
Standard_Integer Ptslength = Points.Length();
if (theNbCalls > 100 && Ptslength < 2)
{
return;
}
Standard_Real Udelta = Ufin - Udeb;
gp_Pnt Pdelta;
if (Nbmin > 2)
@ -450,12 +475,12 @@ void QuasiFleche (const TheCurve& C,
QuasiFleche (C, Deflection2, Udeb, Pdeb,
Udeb + Udelta * 0.5, Pverif,
2,
Parameters, Points);
Parameters, Points, theNbCalls);
QuasiFleche (C, Deflection2, Udeb + Udelta * 0.5, Pverif,
Udeb + Udelta, Pdelta,
2,
Parameters, Points);
Parameters, Points, theNbCalls);
}
if (Nbmin > 2)
@ -463,6 +488,7 @@ void QuasiFleche (const TheCurve& C,
QuasiFleche (C, Deflection2, Udeb + Udelta, Pdelta,
Ufin, Pfin,
Nbmin - (Points.Length() - Ptslength),
Parameters, Points);
Parameters, Points, theNbCalls);
}
theNbCalls--;
}

View File

@ -0,0 +1,16 @@
puts "================"
puts "OCC30133"
puts "================"
puts ""
##########################################
# Modeling Data - Crash during visualization of invalid part
##########################################
restore [locate_data_file bug30133.brep] s
vinit
vdisplay s
vfit
puts "bug30131 is OK"
checkview -screenshot -3d -path ${imagedir}/${test_image}.png