Alembic: Fix double-free of mutex
authorSybren A. Stüvel <sybren@stuvel.eu>
Wed, 6 Jun 2018 10:45:14 +0000 (12:45 +0200)
committerSybren A. Stüvel <sybren@stuvel.eu>
Wed, 6 Jun 2018 12:38:17 +0000 (14:38 +0200)
The mutex was shared between CoW copies of the CacheFile datablock, and
as a result also freed multiple times. It is now only freed when the
original datablock is freed; the CoW copies share the same mutex.

source/blender/blenkernel/intern/cachefile.c

index 274f7b78529e5b83af9be4b67988b61cbabd967d..89c6fad086d1b7b6aa8990c64ccac57f13507500 100644 (file)
@@ -93,7 +93,9 @@ void BKE_cachefile_free(CacheFile *cache_file)
        ABC_free_handle(cache_file->handle);
 #endif
 
-       if (cache_file->handle_mutex) {
+       /* CoW copies share the mutex, so it should only be freed if the original
+        * CacheFile datablock is freed. */
+       if (cache_file->handle_mutex && (cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0) {
                BLI_mutex_free(cache_file->handle_mutex);
        }
        BLI_freelistN(&cache_file->object_paths);