diff options
author | Sybren A. Stüvel <sybren@blender.org> | 2021-10-19 16:48:12 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@blender.org> | 2021-10-19 16:53:11 +0300 |
commit | a7075a30e2611b41af672d5987af662ce5934492 (patch) | |
tree | 0b65e09649b5cdb6e75f32a66617ee409279c5eb /source | |
parent | 219058c213d5c9efce3f44216f6513edc93b5536 (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,
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/callbacks.c | 7 |
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); } |