From 7816900b8e291ed600f2e6d73ef404ba65b2db1c Mon Sep 17 00:00:00 2001 From: emv Date: Mon, 13 May 2019 12:32:09 +0300 Subject: [PATCH] 0030708: Modeling Data - Exception is raised while initializing TopoDS_Iterator with null shape Added protection from null shapes to TopoDS_Iterator::Initialize method. --- src/QABugs/QABugs_19.cxx | 54 +++++++++++++++++++++++++++++++++ src/TopoDS/TopoDS_Iterator.cxx | 12 ++++---- tests/bugs/moddata_3/bug30708_1 | 8 +++++ tests/bugs/moddata_3/bug30708_2 | 8 +++++ 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 tests/bugs/moddata_3/bug30708_1 create mode 100644 tests/bugs/moddata_3/bug30708_2 diff --git a/src/QABugs/QABugs_19.cxx b/src/QABugs/QABugs_19.cxx index 497d270779..39ab345eed 100755 --- a/src/QABugs/QABugs_19.cxx +++ b/src/QABugs/QABugs_19.cxx @@ -4310,6 +4310,54 @@ static Standard_Integer OCC26313(Draw_Interpretor& di,Standard_Integer n,const c return 0; } +//======================================================================= +//function : OCC30708_1 +//purpose : Tests initialization of the TopoDS_Iterator with null shape +//======================================================================= +static Standard_Integer OCC30708_1 (Draw_Interpretor& di, Standard_Integer, const char**) +{ + TopoDS_Iterator it; + try + { + OCC_CATCH_SIGNALS + + TopoDS_Shape empty; + it.Initialize (empty); + + } + catch (Standard_Failure) + { + di << "Cannot initialize TopoDS_Iterator with null shape\n"; + return 0; + } + + if (it.More()) + di << "Incorrect Iterator initialization: method More() returns true on null shape\n"; + + return 0; +} + +//======================================================================= +//function : OCC30708_2 +//purpose : Tests initialization of the BRepLib_MakeWire with null wire +//======================================================================= +static Standard_Integer OCC30708_2 (Draw_Interpretor& di, Standard_Integer, const char**) +{ + try + { + OCC_CATCH_SIGNALS + + TopoDS_Wire empty; + BRepLib_MakeWire aWBuilder (empty); + } + catch (Standard_Failure) + { + di << "Cannot initialize BRepLib_MakeWire with null wire\n"; + } + + return 0; +} + void QABugs::Commands_19(Draw_Interpretor& theCommands) { const char *group = "QABugs"; @@ -4401,5 +4449,11 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) { theCommands.Add ("OCC26313", "OCC26313 result shape", __FILE__, OCC26313, group); + theCommands.Add ("OCC30708_1", "Tests initialization of the TopoDS_Iterator with null shape", + __FILE__, OCC30708_1, group); + + theCommands.Add ("OCC30708_2", "Tests initialization of the BRepLib_MakeWire with null shape", + __FILE__, OCC30708_2, group); + return; } diff --git a/src/TopoDS/TopoDS_Iterator.cxx b/src/TopoDS/TopoDS_Iterator.cxx index a4534fbebd..53220fbb27 100644 --- a/src/TopoDS/TopoDS_Iterator.cxx +++ b/src/TopoDS/TopoDS_Iterator.cxx @@ -23,7 +23,6 @@ //function : Initialize //purpose : //======================================================================= - void TopoDS_Iterator::Initialize(const TopoDS_Shape& S, const Standard_Boolean cumOri, const Standard_Boolean cumLoc) @@ -36,13 +35,16 @@ void TopoDS_Iterator::Initialize(const TopoDS_Shape& S, myOrientation = S.Orientation(); else myOrientation = TopAbs_FORWARD; - myShapes.Initialize(S.TShape()->Shapes()); + + if (S.IsNull()) + myShapes = TopoDS_ListIteratorOfListOfShape(); + else + myShapes.Initialize(S.TShape()->myShapes); + if (More()) { myShape = myShapes.Value(); myShape.Orientation(TopAbs::Compose(myOrientation,myShape.Orientation())); - //modified by NIZNHY-PKV Fri Jan 16 07:42:30 2009f if (!myLocation.IsIdentity()) - //modified by NIZNHY-PKV Fri Jan 16 07:42:37 2009t myShape.Move(myLocation); } } @@ -58,9 +60,7 @@ void TopoDS_Iterator::Next() if (More()) { myShape = myShapes.Value(); myShape.Orientation(TopAbs::Compose(myOrientation,myShape.Orientation())); - //modified by NIZNHY-PKV Fri Jan 16 07:42:30 2009f if (!myLocation.IsIdentity()) - //modified by NIZNHY-PKV Fri Jan 16 07:42:37 2009t myShape.Move(myLocation); } } diff --git a/tests/bugs/moddata_3/bug30708_1 b/tests/bugs/moddata_3/bug30708_1 new file mode 100644 index 0000000000..4d13220a2a --- /dev/null +++ b/tests/bugs/moddata_3/bug30708_1 @@ -0,0 +1,8 @@ +puts "================" +puts "0030708: Modeling Data - Crash while initializing TopoDS_Iterator with null shape" +puts "================" +puts "" + +if { [regexp "Cannot initialize" [OCC30708_1]]} { + puts "Error: Cannot initialize TopoDS_Iterator with null shape" +} diff --git a/tests/bugs/moddata_3/bug30708_2 b/tests/bugs/moddata_3/bug30708_2 new file mode 100644 index 0000000000..e3a8e5a6ac --- /dev/null +++ b/tests/bugs/moddata_3/bug30708_2 @@ -0,0 +1,8 @@ +puts "================" +puts "0030708: Modeling Data - Crash while initializing TopoDS_Iterator with null shape" +puts "================" +puts "" + +if { [regexp "Cannot initialize" [OCC30708_2]]} { + puts "Error: Cannot initialize BRepLib_MakeWire with null wire" +} -- 2.39.5