[Bf-blender-cvs] [2a1d12d7a0e] master: Fix (studio-reported) crash in ID remapping code on rare cases.

Bastien Montagne noreply at git.blender.org
Mon Jul 11 19:25:30 CEST 2022


Commit: 2a1d12d7a0edd7ecffda3c5e1bf5c3b512976bbb
Author: Bastien Montagne
Date:   Mon Jul 11 19:09:56 2022 +0200
Branches: master
https://developer.blender.org/rB2a1d12d7a0edd7ecffda3c5e1bf5c3b512976bbb

Fix (studio-reported) crash in ID remapping code on rare cases.

Some ID types did not have a filter value, even though they would be
used in remapping code, leading to missing remappings. In that specific
case, shape keys would actually never be properly remapped.

Reproducible in r1230 of
`Heist/pro/animation_test/einar/einar_new_expression_shapes2.blend`,

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

M	source/blender/blenkernel/intern/idtype.c
M	source/blender/blenkernel/intern/key.c
M	source/blender/blenkernel/intern/lib_id_remapper.cc
M	source/blender/blenkernel/intern/screen.c
M	source/blender/makesdna/DNA_ID.h
M	source/blender/windowmanager/intern/wm.c

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

diff --git a/source/blender/blenkernel/intern/idtype.c b/source/blender/blenkernel/intern/idtype.c
index e55143d6852..edb6fe5d69b 100644
--- a/source/blender/blenkernel/intern/idtype.c
+++ b/source/blender/blenkernel/intern/idtype.c
@@ -209,7 +209,11 @@ uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
   case ID_##_id: \
     return FILTER_ID_##_id
 
-  switch (idcode) {
+#define CASE_IDFILTER_NONE(_id) \
+  case ID_##_id: \
+    return 0
+
+  switch ((ID_Type)idcode) {
     CASE_IDFILTER(AC);
     CASE_IDFILTER(AR);
     CASE_IDFILTER(BR);
@@ -220,7 +224,10 @@ uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
     CASE_IDFILTER(GR);
     CASE_IDFILTER(CV);
     CASE_IDFILTER(IM);
+    CASE_IDFILTER_NONE(IP);
+    CASE_IDFILTER(KE);
     CASE_IDFILTER(LA);
+    CASE_IDFILTER_NONE(LI);
     CASE_IDFILTER(LS);
     CASE_IDFILTER(LT);
     CASE_IDFILTER(MA);
@@ -236,6 +243,7 @@ uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
     CASE_IDFILTER(PT);
     CASE_IDFILTER(LP);
     CASE_IDFILTER(SCE);
+    CASE_IDFILTER(SCR);
     CASE_IDFILTER(SIM);
     CASE_IDFILTER(SPK);
     CASE_IDFILTER(SO);
@@ -243,13 +251,16 @@ uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
     CASE_IDFILTER(TXT);
     CASE_IDFILTER(VF);
     CASE_IDFILTER(VO);
+    CASE_IDFILTER(WM);
     CASE_IDFILTER(WO);
     CASE_IDFILTER(WS);
-    default:
-      return 0;
   }
 
+  BLI_assert_unreachable();
+  return 0;
+
 #undef CASE_IDFILTER
+#undef CASE_IDFILTER_NONE
 }
 
 short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
@@ -269,6 +280,7 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
     CASE_IDFILTER(GR);
     CASE_IDFILTER(CV);
     CASE_IDFILTER(IM);
+    CASE_IDFILTER(KE);
     CASE_IDFILTER(LA);
     CASE_IDFILTER(LS);
     CASE_IDFILTER(LT);
@@ -285,6 +297,7 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
     CASE_IDFILTER(PT);
     CASE_IDFILTER(LP);
     CASE_IDFILTER(SCE);
+    CASE_IDFILTER(SCR);
     CASE_IDFILTER(SIM);
     CASE_IDFILTER(SPK);
     CASE_IDFILTER(SO);
@@ -292,11 +305,14 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
     CASE_IDFILTER(TXT);
     CASE_IDFILTER(VF);
     CASE_IDFILTER(VO);
+    CASE_IDFILTER(WM);
     CASE_IDFILTER(WO);
-    default:
-      return 0;
+    CASE_IDFILTER(WS);
   }
 
+  BLI_assert_unreachable();
+  return 0;
+
 #undef CASE_IDFILTER
 }
 
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 594cffe6406..97eac0b9f91 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -191,7 +191,7 @@ static void shapekey_blend_read_expand(BlendExpander *expander, ID *id)
 
 IDTypeInfo IDType_ID_KE = {
     .id_code = ID_KE,
-    .id_filter = 0,
+    .id_filter = FILTER_ID_KE,
     .main_listbase_index = INDEX_ID_KE,
     .struct_size = sizeof(Key),
     .name = "Key",
diff --git a/source/blender/blenkernel/intern/lib_id_remapper.cc b/source/blender/blenkernel/intern/lib_id_remapper.cc
index 7e75e0f5d93..98ac9110a48 100644
--- a/source/blender/blenkernel/intern/lib_id_remapper.cc
+++ b/source/blender/blenkernel/intern/lib_id_remapper.cc
@@ -36,6 +36,7 @@ struct IDRemapper {
     BLI_assert(old_id != nullptr);
     BLI_assert(new_id == nullptr || (GS(old_id->name) == GS(new_id->name)));
     mappings.add(old_id, new_id);
+    BLI_assert(BKE_idtype_idcode_to_idfilter(GS(old_id->name)) != 0);
     source_types |= BKE_idtype_idcode_to_idfilter(GS(old_id->name));
   }
 
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 12dc1b6d1fa..c16e5ce5655 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -277,7 +277,7 @@ static void screen_blend_read_lib(BlendLibReader *reader, ID *id)
 
 IDTypeInfo IDType_ID_SCR = {
     .id_code = ID_SCR,
-    .id_filter = 0,
+    .id_filter = FILTER_ID_SCR,
     .main_listbase_index = INDEX_ID_SCR,
     .struct_size = sizeof(bScreen),
     .name = "Screen",
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 451c921c4ef..f6032b71155 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -923,6 +923,9 @@ typedef enum IDRecalcFlag {
 #define FILTER_ID_PT (1ULL << 33)
 #define FILTER_ID_VO (1ULL << 34)
 #define FILTER_ID_SIM (1ULL << 35)
+#define FILTER_ID_KE (1ULL << 36)
+#define FILTER_ID_SCR (1ULL << 37)
+#define FILTER_ID_WM (1ULL << 38)
 
 #define FILTER_ID_ALL \
   (FILTER_ID_AC | FILTER_ID_AR | FILTER_ID_BR | FILTER_ID_CA | FILTER_ID_CU_LEGACY | \
@@ -930,7 +933,8 @@ typedef enum IDRecalcFlag {
    FILTER_ID_MA | FILTER_ID_MB | FILTER_ID_MC | FILTER_ID_ME | FILTER_ID_MSK | FILTER_ID_NT | \
    FILTER_ID_OB | FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | FILTER_ID_SPK | \
    FILTER_ID_SO | FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | FILTER_ID_CF | \
-   FILTER_ID_WS | FILTER_ID_LP | FILTER_ID_CV | FILTER_ID_PT | FILTER_ID_VO | FILTER_ID_SIM)
+   FILTER_ID_WS | FILTER_ID_LP | FILTER_ID_CV | FILTER_ID_PT | FILTER_ID_VO | FILTER_ID_SIM | \
+   FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM)
 
 /**
  * This enum defines the index assigned to each type of IDs in the array returned by
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 32cec8f779c..0d74bc259f4 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -257,7 +257,7 @@ static void window_manager_blend_read_lib(BlendLibReader *reader, ID *id)
 
 IDTypeInfo IDType_ID_WM = {
     .id_code = ID_WM,
-    .id_filter = 0,
+    .id_filter = FILTER_ID_WM,
     .main_listbase_index = INDEX_ID_WM,
     .struct_size = sizeof(wmWindowManager),
     .name = "WindowManager",



More information about the Bf-blender-cvs mailing list