From 18c0d8ab122e7e28cd4c5a92bc9eb62662e941cd Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sun, 6 Sep 2020 16:01:16 +0800 Subject: [PATCH] Part: fix dangerous static_cast usage in view provider Because Gui::ViewProviderLink can be used to override the view provider of any object, it is not safe to assume view provider type without explicit checking. --- src/Mod/Part/Gui/ViewProviderBoolean.cpp | 26 +++++++++++---------- src/Mod/Part/Gui/ViewProviderCompound.cpp | 20 ++++++++-------- src/Mod/Part/Gui/ViewProviderMirror.cpp | 28 ++++++++++++----------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/Mod/Part/Gui/ViewProviderBoolean.cpp b/src/Mod/Part/Gui/ViewProviderBoolean.cpp index 2b5c94a481..86c591056b 100644 --- a/src/Mod/Part/Gui/ViewProviderBoolean.cpp +++ b/src/Mod/Part/Gui/ViewProviderBoolean.cpp @@ -102,15 +102,17 @@ void ViewProviderBoolean::updateData(const App::Property* prop) TopExp::MapShapes(toolShape, TopAbs_FACE, toolMap); TopExp::MapShapes(boolShape, TopAbs_FACE, boolMap); - Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); - Gui::ViewProvider* vpTool = Gui::Application::Instance->getViewProvider(objTool); + auto vpBase = dynamic_cast( + Gui::Application::Instance->getViewProvider(objBase)); + auto vpTool = dynamic_cast( + Gui::Application::Instance->getViewProvider(objTool)); if (vpBase && vpTool) { - std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); - std::vector colTool = static_cast(vpTool)->DiffuseColor.getValues(); + std::vector colBase = vpBase->DiffuseColor.getValues(); + std::vector colTool = vpTool->DiffuseColor.getValues(); std::vector colBool; colBool.resize(boolMap.Extent(), this->ShapeColor.getValue()); - applyTransparency(static_cast(vpBase)->Transparency.getValue(),colBase); - applyTransparency(static_cast(vpTool)->Transparency.getValue(),colTool); + applyTransparency(vpBase->Transparency.getValue(),colBase); + applyTransparency(vpTool->Transparency.getValue(),colTool); if (static_cast(colBase.size()) == baseMap.Extent()) { applyColor(hist[0], colBase, colBool); @@ -202,10 +204,10 @@ void ViewProviderMultiFuse::updateData(const App::Property* prop) TopTools_IndexedMapOfShape baseMap; TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); - Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); + auto vpBase = dynamic_cast(Gui::Application::Instance->getViewProvider(objBase)); if (vpBase) { - std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); - applyTransparency(static_cast(vpBase)->Transparency.getValue(),colBase); + std::vector colBase = vpBase->DiffuseColor.getValues(); + applyTransparency(vpBase->Transparency.getValue(),colBase); if (static_cast(colBase.size()) == baseMap.Extent()) { applyColor(hist[index], colBase, colBool); } @@ -333,10 +335,10 @@ void ViewProviderMultiCommon::updateData(const App::Property* prop) TopTools_IndexedMapOfShape baseMap; TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); - Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); + auto vpBase = dynamic_cast(Gui::Application::Instance->getViewProvider(objBase)); if (vpBase) { - std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); - applyTransparency(static_cast(vpBase)->Transparency.getValue(),colBase); + std::vector colBase = vpBase->DiffuseColor.getValues(); + applyTransparency(vpBase->Transparency.getValue(),colBase); if (static_cast(colBase.size()) == baseMap.Extent()) { applyColor(hist[index], colBase, colBool); } diff --git a/src/Mod/Part/Gui/ViewProviderCompound.cpp b/src/Mod/Part/Gui/ViewProviderCompound.cpp index 0aa42710d0..f98a5ba53a 100644 --- a/src/Mod/Part/Gui/ViewProviderCompound.cpp +++ b/src/Mod/Part/Gui/ViewProviderCompound.cpp @@ -111,15 +111,17 @@ void ViewProviderCompound::updateData(const App::Property* prop) TopTools_IndexedMapOfShape baseMap; TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); - Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); - std::vector baseCol = static_cast(vpBase)->DiffuseColor.getValues(); - applyTransparency(static_cast(vpBase)->Transparency.getValue(),baseCol); - if (static_cast(baseCol.size()) == baseMap.Extent()) { - applyColor(hist[index], baseCol, compCol); - } - else if (!baseCol.empty() && baseCol[0] != this->ShapeColor.getValue()) { - baseCol.resize(baseMap.Extent(), baseCol[0]); - applyColor(hist[index], baseCol, compCol); + auto vpBase = dynamic_cast(Gui::Application::Instance->getViewProvider(objBase)); + if (vpBase) { + std::vector baseCol = vpBase->DiffuseColor.getValues(); + applyTransparency(vpBase->Transparency.getValue(),baseCol); + if (static_cast(baseCol.size()) == baseMap.Extent()) { + applyColor(hist[index], baseCol, compCol); + } + else if (!baseCol.empty() && baseCol[0] != this->ShapeColor.getValue()) { + baseCol.resize(baseMap.Extent(), baseCol[0]); + applyColor(hist[index], baseCol, compCol); + } } } diff --git a/src/Mod/Part/Gui/ViewProviderMirror.cpp b/src/Mod/Part/Gui/ViewProviderMirror.cpp index 68eb9c30f6..92ce5e1f73 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.cpp +++ b/src/Mod/Part/Gui/ViewProviderMirror.cpp @@ -252,21 +252,23 @@ void ViewProviderFillet::updateData(const App::Property* prop) TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); TopExp::MapShapes(fillShape, TopAbs_FACE, fillMap); - Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); - std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); - std::vector colFill; - colFill.resize(fillMap.Extent(), static_cast(vpBase)->ShapeColor.getValue()); - applyTransparency(static_cast(vpBase)->Transparency.getValue(),colBase); + auto vpBase = dynamic_cast(Gui::Application::Instance->getViewProvider(objBase)); + if (vpBase) { + std::vector colBase = vpBase->DiffuseColor.getValues(); + std::vector colFill; + colFill.resize(fillMap.Extent(), vpBase->ShapeColor.getValue()); + applyTransparency(vpBase->Transparency.getValue(),colBase); - if (static_cast(colBase.size()) == baseMap.Extent()) { - applyColor(hist[0], colBase, colFill); - } - else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { - colBase.resize(baseMap.Extent(), colBase[0]); - applyColor(hist[0], colBase, colFill); - } + if (static_cast(colBase.size()) == baseMap.Extent()) { + applyColor(hist[0], colBase, colFill); + } + else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { + colBase.resize(baseMap.Extent(), colBase[0]); + applyColor(hist[0], colBase, colFill); + } - this->DiffuseColor.setValues(colFill); + this->DiffuseColor.setValues(colFill); + } } } }