Gui: add security checks to view provider extensions because they can be accessed if a document objects is not yet attached

This commit is contained in:
wmayer
2024-04-06 02:12:04 +02:00
parent 262a218b6b
commit 15dcd1e9be
5 changed files with 30 additions and 13 deletions

View File

@@ -67,7 +67,8 @@ ViewProviderGeoFeatureGroupExtension::~ViewProviderGeoFeatureGroupExtension()
std::vector<App::DocumentObject*> ViewProviderGeoFeatureGroupExtension::extensionClaimChildren3D() const {
//all object in the group must be claimed in 3D, as we are a coordinate system for all of them
auto* ext = getExtendedViewProvider()->getObject()->getExtensionByType<App::GeoFeatureGroupExtension>();
auto* obj = getExtendedViewProvider()->getObject();
auto* ext = obj ? obj->getExtensionByType<App::GeoFeatureGroupExtension>() : nullptr;
if (ext) {
auto objs = ext->Group.getValues();
return objs;
@@ -77,7 +78,12 @@ std::vector<App::DocumentObject*> ViewProviderGeoFeatureGroupExtension::extensio
std::vector<App::DocumentObject*> ViewProviderGeoFeatureGroupExtension::extensionClaimChildren() const {
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::GeoFeatureGroupExtension>();
auto* obj = getExtendedViewProvider()->getObject();
if (!obj) {
return {};
}
auto* group = obj->getExtensionByType<App::GeoFeatureGroupExtension>();
const std::vector<App::DocumentObject*> &model = group->Group.getValues ();
std::set<App::DocumentObject*> outSet; //< set of objects not to claim (childrens of childrens)
@@ -142,9 +148,10 @@ std::vector<std::string> ViewProviderGeoFeatureGroupExtension::extensionGetDispl
void ViewProviderGeoFeatureGroupExtension::extensionUpdateData(const App::Property* prop)
{
auto obj = getExtendedViewProvider()->getObject()->getExtensionByType<App::GeoFeatureGroupExtension>();
if (obj && prop == &obj->placement()) {
getExtendedViewProvider()->setTransformation ( obj->placement().getValue().toMatrix() );
auto obj = getExtendedViewProvider()->getObject();
auto grp = obj ? obj->getExtensionByType<App::GeoFeatureGroupExtension>() : nullptr;
if (grp && prop == &grp->placement()) {
getExtendedViewProvider()->setTransformation ( grp->placement().getValue().toMatrix() );
}
else {
ViewProviderGroupExtension::extensionUpdateData ( prop );

View File

@@ -108,7 +108,12 @@ void ViewProviderGroupExtension::extensionDropObject(App::DocumentObject* obj) {
std::vector< App::DocumentObject* > ViewProviderGroupExtension::extensionClaimChildren() const {
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::GroupExtension>();
auto* obj = getExtendedViewProvider()->getObject();
if (!obj) {
return {};
}
auto* group = obj->getExtensionByType<App::GroupExtension>();
return group->Group.getValues();
}

View File

@@ -62,7 +62,8 @@ ViewProviderOriginGroupExtension::~ViewProviderOriginGroupExtension()
std::vector<App::DocumentObject*> ViewProviderOriginGroupExtension::constructChildren (
const std::vector<App::DocumentObject*> &children ) const
{
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::OriginGroupExtension>();
auto* obj = getExtendedViewProvider()->getObject();
auto* group = obj ? obj->getExtensionByType<App::OriginGroupExtension>() : nullptr;
if(!group)
return children;
@@ -108,7 +109,8 @@ void ViewProviderOriginGroupExtension::extensionAttach(App::DocumentObject *pcOb
void ViewProviderOriginGroupExtension::extensionUpdateData( const App::Property* prop ) {
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::OriginGroupExtension>();
auto* obj = getExtendedViewProvider()->getObject();
auto* group = obj ? obj->getExtensionByType<App::OriginGroupExtension>() : nullptr;
if ( group && prop == &group->Group ) {
updateOriginSize();
}
@@ -117,7 +119,8 @@ void ViewProviderOriginGroupExtension::extensionUpdateData( const App::Property*
}
void ViewProviderOriginGroupExtension::slotChangedObjectApp ( const App::DocumentObject& obj) {
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::OriginGroupExtension>();
auto* ext = getExtendedViewProvider()->getObject();
auto* group = ext ? ext->getExtensionByType<App::OriginGroupExtension>() : nullptr;
if ( group && group->hasObject (&obj, /*recursive=*/ true ) ) {
updateOriginSize ();
}
@@ -127,7 +130,8 @@ void ViewProviderOriginGroupExtension::slotChangedObjectGui ( const Gui::ViewPro
if ( !vp.isDerivedFrom ( Gui::ViewProviderOriginFeature::getClassTypeId () )) {
// Ignore origins to avoid infinite recursion (not likely in a well-formed document,
// but may happen in documents designed in old versions of assembly branch )
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::OriginGroupExtension>();
auto* ext = getExtendedViewProvider()->getObject();
auto* group = ext ? ext->getExtensionByType<App::OriginGroupExtension>() : nullptr;
App::DocumentObject *obj = vp.getObject ();
if ( group && obj && group->hasObject (obj, /*recursive=*/ true ) ) {

View File

@@ -53,7 +53,7 @@ void ViewProviderSuppressibleExtension::extensionUpdateData(const App::Property*
{
auto vp = getExtendedViewProvider();
auto owner = vp->getObject();
if(!owner->isValid())
if(!owner || !owner->isValid())
return;
auto ext = owner->getExtensionByType<App::SuppressibleExtension>();

View File

@@ -77,8 +77,9 @@ QIcon ViewProviderAttachExtension::extensionMergeColorfullOverlayIcons (const QI
void ViewProviderAttachExtension::extensionUpdateData(const App::Property* prop)
{
if (getExtendedViewProvider()->getObject()->hasExtension(Part::AttachExtension::getExtensionClassTypeId())) {
auto* attach = getExtendedViewProvider()->getObject()->getExtensionByType<Part::AttachExtension>();
auto obj = getExtendedViewProvider()->getObject();
if (obj && obj->hasExtension(Part::AttachExtension::getExtensionClassTypeId())) {
auto* attach = obj->getExtensionByType<Part::AttachExtension>();
if(attach) {
if( prop == &(attach->AttachmentSupport) ||