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:
authorSybren A. Stüvel <sybren@blender.org>2021-10-19 16:48:12 +0300
committerSybren A. Stüvel <sybren@blender.org>2021-10-19 16:53:11 +0300
commita7075a30e2611b41af672d5987af662ce5934492 (patch)
tree0b65e09649b5cdb6e75f32a66617ee409279c5eb
parent219058c213d5c9efce3f44216f6513edc93b5536 (diff)
BKE_callback_remove: prevent crash on Blender exit
`BKE_callback_remove` now checks whether the callback actually is known, before trying to remove it. `BKE_blender_atexit()` runs after `BKE_callback_global_finalize()`. When an at-exit callback tried to unregister its BKE callbacks, these would already be unregistered, causing a crash of Blender when exiting,
-rw-r--r--source/blender/blenkernel/intern/callbacks.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/callbacks.c b/source/blender/blenkernel/intern/callbacks.c
index 7fd3048b740..dbc213907ac 100644
--- a/source/blender/blenkernel/intern/callbacks.c
+++ b/source/blender/blenkernel/intern/callbacks.c
@@ -82,7 +82,12 @@ void BKE_callback_add(bCallbackFuncStore *funcstore, eCbEvent evt)
void BKE_callback_remove(bCallbackFuncStore *funcstore, eCbEvent evt)
{
ListBase *lb = &callback_slots[evt];
- BLI_remlink(lb, funcstore);
+
+ /* Be safe, as the callback may have already been removed by BKE_callback_global_finalize(), for
+ * example when removing callbacks in response to a BKE_blender_atexit_register callback
+ * function. `BKE_blender_atexit()` runs after `BKE_callback_global_finalize()`. */
+ BLI_remlink_safe(lb, funcstore);
+
if (funcstore->alloc) {
MEM_freeN(funcstore);
}