diff options
author | Bastien Montagne <bastien@blender.org> | 2020-07-06 16:07:12 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2020-07-06 16:09:39 +0300 |
commit | 0b07f9b71738c59b3834e2fc8b19779c72b3b020 (patch) | |
tree | 47c81a0946f76e72ec00587a8f9c0ac502360e53 /source/blender/blenloader | |
parent | 99feb10b8b2ed68cb2743d3ac3464717ff65f9bd (diff) |
Fix T78608: Memory leak in Material properties: "Data from SCE".
Caused by recent own refactor of cache presevation handling in readfile,
EEVEE's lightcache are weird birds that can also be saved in .blend
files, need a special handling for those 'persistent' caches...
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 836260c46e5..441421c8736 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2263,6 +2263,7 @@ typedef struct BLOCacheStorage { static void blo_cache_storage_entry_register(ID *id, const IDCacheKey *key, void **UNUSED(cache_p), + eIDTypeInfoCacheCallbackFlags UNUSED(flags), void *cache_storage_v) { BLI_assert(key->id_session_uuid == id->session_uuid); @@ -2280,12 +2281,18 @@ static void blo_cache_storage_entry_register(ID *id, static void blo_cache_storage_entry_restore_in_new(ID *UNUSED(id), const IDCacheKey *key, void **cache_p, + eIDTypeInfoCacheCallbackFlags flags, void *cache_storage_v) { BLOCacheStorage *cache_storage = cache_storage_v; if (cache_storage == NULL) { - *cache_p = NULL; + /* In non-undo case, only clear the pointer if it is a purely runtime one. + * If it may be stored in a persistent way in the .blend file, direct_link code is responsible + * to properly deal with it. */ + if ((flags & IDTYPE_CACHE_CB_FLAGS_PERSISTENT) == 0) { + *cache_p = NULL; + } return; } @@ -2302,6 +2309,7 @@ static void blo_cache_storage_entry_restore_in_new(ID *UNUSED(id), static void blo_cache_storage_entry_clear_in_old(ID *UNUSED(id), const IDCacheKey *key, void **cache_p, + eIDTypeInfoCacheCallbackFlags UNUSED(flags), void *cache_storage_v) { BLOCacheStorage *cache_storage = cache_storage_v; @@ -9249,8 +9257,8 @@ static BHead *read_data_into_datamap(FileData *fd, BHead *bhead, const char *all void *data; #if 0 /* XXX DUMB DEBUGGING OPTION TO GIVE NAMES for guarded malloc errors */ - short* sp = fd->filesdna->structs[bhead->SDNAnr]; - char* tmp = malloc(100); + short *sp = fd->filesdna->structs[bhead->SDNAnr]; + char *tmp = malloc(100); allocname = fd->filesdna->types[sp[0]]; strcpy(tmp, allocname); data = read_struct(fd, bhead, tmp); |