[Bf-blender-cvs] [33d0b7c5bdd] blender-v3.3-release: Fix T100133: Crash when linking an evaluated object to a collection.

Bastien Montagne noreply at git.blender.org
Tue Aug 2 12:54:15 CEST 2022


Commit: 33d0b7c5bdd8bdbde0a3fd6e7982440c151e321b
Author: Bastien Montagne
Date:   Tue Aug 2 12:52:35 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB33d0b7c5bdd8bdbde0a3fd6e7982440c151e321b

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.

===================================================================

M	source/blender/makesrna/intern/rna_collection.c

===================================================================

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,



More information about the Bf-blender-cvs mailing list