Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2022-08-02 13:52:35 +0300
committerBastien Montagne <bastien@blender.org>2022-08-02 13:54:08 +0300
commit33d0b7c5bdd8bdbde0a3fd6e7982440c151e321b (patch)
treed883445eb831cb72adb87a00041de45c861ffe5d /source/blender/makesrna/intern/rna_collection.c
parentfdf34666f00fc0995507b46e30a0e732812cd05e (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.c76
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,