diff options
author | Bastien Montagne <bastien@blender.org> | 2022-08-02 13:52:35 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2022-08-02 13:54:08 +0300 |
commit | 33d0b7c5bdd8bdbde0a3fd6e7982440c151e321b (patch) | |
tree | d883445eb831cb72adb87a00041de45c861ffe5d /source/blender/makesrna/intern/rna_collection.c | |
parent | fdf34666f00fc0995507b46e30a0e732812cd05e (diff) |
Fix T100133: Crash when linking an evaluated object to a collection.
Note that ideally, we should have a protection mechnism at global RNA
level, making e.g. any evaluated data read-only... But for now, give
better (and more consistent) protection for the collections' link/unlink
of children collections and objects.
Diffstat (limited to 'source/blender/makesrna/intern/rna_collection.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_collection.c | 76 |
1 files changed, 69 insertions, 7 deletions
diff --git a/source/blender/makesrna/intern/rna_collection.c b/source/blender/makesrna/intern/rna_collection.c index 4657f7e9a9f..84ddea368e7 100644 --- a/source/blender/makesrna/intern/rna_collection.c +++ b/source/blender/makesrna/intern/rna_collection.c @@ -39,6 +39,7 @@ const EnumPropertyItem rna_enum_collection_color_items[] = { # include "DEG_depsgraph.h" # include "DEG_depsgraph_build.h" +# include "DEG_depsgraph_query.h" # include "BKE_collection.h" # include "BKE_global.h" @@ -79,26 +80,45 @@ static PointerRNA rna_Collection_objects_get(CollectionPropertyIterator *iter) return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, cob->ob); } -static void rna_Collection_objects_link(Collection *collection, - Main *bmain, - ReportList *reports, - Object *object) +static bool rna_collection_objects_edit_check(Collection *collection, + ReportList *reports, + Object *object) { + if (!DEG_is_original_id(&collection->id)) { + BKE_reportf( + reports, RPT_ERROR, "Collection '%s' is not an original ID", collection->id.name + 2); + return false; + } + if (!DEG_is_original_id(&object->id)) { + BKE_reportf(reports, RPT_ERROR, "Collection '%s' is not an original ID", object->id.name + 2); + return false; + } /* Currently this should not be allowed (might be supported in the future though...). */ if (ID_IS_OVERRIDE_LIBRARY(&collection->id)) { BKE_reportf(reports, RPT_ERROR, - "Could not link the object '%s' because the collection '%s' is overridden", + "Could not (un)link the object '%s' because the collection '%s' is overridden", object->id.name + 2, collection->id.name + 2); - return; + return false; } if (ID_IS_LINKED(&collection->id)) { BKE_reportf(reports, RPT_ERROR, - "Could not link the object '%s' because the collection '%s' is linked", + "Could not (un)link the object '%s' because the collection '%s' is linked", object->id.name + 2, collection->id.name + 2); + return false; + } + return true; +} + +static void rna_Collection_objects_link(Collection *collection, + Main *bmain, + ReportList *reports, + Object *object) +{ + if (!rna_collection_objects_edit_check(collection, reports, object)) { return; } if (!BKE_collection_object_add(bmain, collection, object)) { @@ -120,6 +140,9 @@ static void rna_Collection_objects_unlink(Collection *collection, ReportList *reports, Object *object) { + if (!rna_collection_objects_edit_check(collection, reports, object)) { + return; + } if (!BKE_collection_object_remove(bmain, collection, object, false)) { BKE_reportf(reports, RPT_ERROR, @@ -204,11 +227,47 @@ static PointerRNA rna_Collection_children_get(CollectionPropertyIterator *iter) return rna_pointer_inherit_refine(&iter->parent, &RNA_Collection, child->collection); } +static bool rna_collection_children_edit_check(Collection *collection, + ReportList *reports, + Collection *child) +{ + if (!DEG_is_original_id(&collection->id)) { + BKE_reportf( + reports, RPT_ERROR, "Collection '%s' is not an original ID", collection->id.name + 2); + return false; + } + if (!DEG_is_original_id(&child->id)) { + BKE_reportf(reports, RPT_ERROR, "Collection '%s' is not an original ID", child->id.name + 2); + return false; + } + /* Currently this should not be allowed (might be supported in the future though...). */ + if (ID_IS_OVERRIDE_LIBRARY(&collection->id)) { + BKE_reportf(reports, + RPT_ERROR, + "Could not (un)link the collection '%s' because the collection '%s' is overridden", + child->id.name + 2, + collection->id.name + 2); + return false; + } + if (ID_IS_LINKED(&collection->id)) { + BKE_reportf(reports, + RPT_ERROR, + "Could not (un)link the collection '%s' because the collection '%s' is linked", + child->id.name + 2, + collection->id.name + 2); + return false; + } + return true; +} + static void rna_Collection_children_link(Collection *collection, Main *bmain, ReportList *reports, Collection *child) { + if (!rna_collection_children_edit_check(collection, reports, child)) { + return; + } if (!BKE_collection_child_add(bmain, collection, child)) { BKE_reportf(reports, RPT_ERROR, @@ -228,6 +287,9 @@ static void rna_Collection_children_unlink(Collection *collection, ReportList *reports, Collection *child) { + if (!rna_collection_children_edit_check(collection, reports, child)) { + return; + } if (!BKE_collection_child_remove(bmain, collection, child)) { BKE_reportf(reports, RPT_ERROR, |