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-02-03 19:17:07 +0300
committerBastien Montagne <bastien@blender.org>2022-02-03 19:19:04 +0300
commit71cd9f9fbb40e6e93e4cbf30184a96b90b772672 (patch)
tree80033cbff0d974ae2321735f4bfe0420b1a9ec52
parent4be87e97f48533e16594b6ec73980ffb2ba12ade (diff)
Fix (unreported) broken logic in proxy to liboverride conversion.
Iterating over scene's objects while we modify those (through proxy to override conversion code) is call for problems (use after free etc.). Instead, all proxy objects need to be gathered first in a temporary list, and processed all at once in a second loop.
-rw-r--r--source/blender/blenkernel/intern/lib_override.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index 226b2ea636a..649e7dab5d1 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -1107,23 +1107,29 @@ static void lib_override_library_proxy_convert_do(Main *bmain,
void BKE_lib_override_library_main_proxy_convert(Main *bmain, BlendFileReadReport *reports)
{
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
+ LinkNodePair proxy_objects = {NULL};
+
FOREACH_SCENE_OBJECT_BEGIN (scene, object) {
- if (object->proxy_group == NULL) {
- continue;
+ if (object->proxy_group != NULL) {
+ BLI_linklist_append(&proxy_objects, object);
}
-
- lib_override_library_proxy_convert_do(bmain, scene, object, reports);
}
FOREACH_SCENE_OBJECT_END;
FOREACH_SCENE_OBJECT_BEGIN (scene, object) {
- if (object->proxy == NULL) {
- continue;
+ if (object->proxy != NULL && object->proxy_group == NULL) {
+ BLI_linklist_append(&proxy_objects, object);
}
-
- lib_override_library_proxy_convert_do(bmain, scene, object, reports);
}
FOREACH_SCENE_OBJECT_END;
+
+ for (LinkNode *proxy_object_iter = proxy_objects.list; proxy_object_iter != NULL;
+ proxy_object_iter = proxy_object_iter->next) {
+ Object *proxy_object = proxy_object_iter->link;
+ lib_override_library_proxy_convert_do(bmain, scene, proxy_object, reports);
+ }
+
+ BLI_linklist_free(proxy_objects.list, NULL);
}
LISTBASE_FOREACH (Object *, object, &bmain->objects) {