Fix T59220: Deleting object causes blender 2.8 to crash

The issue was caused by a special code in node tree freeing function
which will free extra fields in the case when tree is not in bmain.
This is how old code was dealing with "nested" trees, but is now
making behavior different from other datablocks. This is exactly
what was confusing copy-on-write logic.

Ideally, ntreeFreeTree() need to behave same as all other datablocks,
ad freeing of data of nested trees should be up to the owner of the
tree (this way it's all explicit and does not depend on check of
some special flag.
This commit is contained in:
Sergey Sharybin 2018-12-14 14:53:29 +01:00
parent e54182427a
commit 1e18efa1df
Notes: blender-bot 2023-02-14 04:35:45 +01:00
Referenced by issue #59220, Deleting object causes blender 2.8 to crash
Referenced by issue #59081, Some material node groups in 2.80, from 2.7x files, crash in 2.80
1 changed files with 6 additions and 0 deletions

View File

@ -679,13 +679,19 @@ void BKE_libblock_relink_to_newid(ID *id)
void BKE_libblock_free_data(ID *id, const bool do_id_user)
{
/* NOTE: We set pointers to NULL so subsequent call of this function doesn't
* cause double-free.
* This is mainly to prevent crazy behavior of ntreeFreeTree() which does
* call BKE_libblock_free_data() for nodetrees outside of bmain. */
if (id->properties) {
IDP_FreeProperty_ex(id->properties, do_id_user);
MEM_freeN(id->properties);
id->properties = NULL;
}
if (id->override_static) {
BKE_override_static_free(&id->override_static);
id->override_static = NULL;
}
/* XXX TODO remove animdata handling from each type's freeing func, and do it here, like for copy! */