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
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-12-14 17:20:33 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-12-14 17:29:16 +0300
commite67f7e922cfe6742753944fa1bf4ace358b382a7 (patch)
tree8f3c3925532b1f8e8a7d7883ba3b3460e18e13f5 /source
parent1e18efa1df1ad999303143156e0742d97d4c86bb (diff)
Attempt to sanitize node tree deletion
Make it explicit when freeing node tree which is owned by other ID or when freeing node tree which is outside of a bmain.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_node.h3
-rw-r--r--source/blender/blenkernel/intern/lamp.c2
-rw-r--r--source/blender/blenkernel/intern/library_remap.c6
-rw-r--r--source/blender/blenkernel/intern/linestyle.c2
-rw-r--r--source/blender/blenkernel/intern/material.c6
-rw-r--r--source/blender/blenkernel/intern/node.c20
-rw-r--r--source/blender/blenkernel/intern/scene.c2
-rw-r--r--source/blender/blenkernel/intern/texture.c2
-rw-r--r--source/blender/blenkernel/intern/world.c2
-rw-r--r--source/blender/blenloader/intern/versioning_defaults.c2
-rw-r--r--source/blender/gpu/intern/gpu_material.c2
11 files changed, 31 insertions, 18 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 5f0635037c2..0368f5befd3 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -332,6 +332,8 @@ struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char
/* copy/free funcs, need to manage ID users */
void ntreeFreeTree(struct bNodeTree *ntree);
+/* Free tree which is owned byt another datablock. */
+void ntreeFreeNestedTree(struct bNodeTree *ntree);
void BKE_node_tree_copy_data(struct Main *bmain, struct bNodeTree *ntree_dst, const struct bNodeTree *ntree_src, const int flag);
struct bNodeTree *ntreeCopyTree_ex(const struct bNodeTree *ntree, struct Main *bmain, const bool do_id_user);
struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntree);
@@ -343,6 +345,7 @@ void ntreeUserDecrefID(struct bNodeTree *ntree);
struct bNodeTree *ntreeFromID(const struct ID *id);
void ntreeMakeLocal(struct Main *bmain, struct bNodeTree *ntree, bool id_in_mainlist, const bool lib_local);
+void ntreeFreeLocalTree(struct bNodeTree *ntree);
struct bNode *ntreeFindType(const struct bNodeTree *ntree, int type);
bool ntreeHasType(const struct bNodeTree *ntree, int type);
bool ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index a6ec44f524c..ff79185d2b4 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -177,7 +177,7 @@ void BKE_lamp_free(Lamp *la)
/* is no lib link block, but lamp extension */
if (la->nodetree) {
- ntreeFreeTree(la->nodetree);
+ ntreeFreeNestedTree(la->nodetree);
MEM_freeN(la->nodetree);
la->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index 70f3c6d6cf6..458d723c95a 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -679,19 +679,13 @@ 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! */
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index fdf5ef5f0c1..31a261fdb4f 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -139,7 +139,7 @@ void BKE_linestyle_free(FreestyleLineStyle *linestyle)
/* is no lib link block, but linestyle extension */
if (linestyle->nodetree) {
- ntreeFreeTree(linestyle->nodetree);
+ ntreeFreeNestedTree(linestyle->nodetree);
MEM_freeN(linestyle->nodetree);
linestyle->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 81c220045ba..30fc02e94de 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -99,7 +99,7 @@ void BKE_material_free(Material *ma)
/* is no lib link block, but material extension */
if (ma->nodetree) {
- ntreeFreeTree(ma->nodetree);
+ ntreeFreeNestedTree(ma->nodetree);
MEM_freeN(ma->nodetree);
ma->nodetree = NULL;
}
@@ -1373,7 +1373,7 @@ void clear_matcopybuf(void)
void free_matcopybuf(void)
{
if (matcopybuf.nodetree) {
- ntreeFreeTree(matcopybuf.nodetree);
+ ntreeFreeLocalTree(matcopybuf.nodetree);
MEM_freeN(matcopybuf.nodetree);
matcopybuf.nodetree = NULL;
}
@@ -1406,7 +1406,7 @@ void paste_matcopybuf(Main *bmain, Material *ma)
GPU_material_free(&ma->gpumaterial);
if (ma->nodetree) {
- ntreeFreeTree(ma->nodetree);
+ ntreeFreeNestedTree(ma->nodetree);
MEM_freeN(ma->nodetree);
}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 9b06b49a5d9..ea31ad08e61 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1870,8 +1870,24 @@ void ntreeFreeTree(bNodeTree *ntree)
if (ntree->duplilock)
BLI_mutex_free(ntree->duplilock);
- /* if ntree is not part of library, free the libblock data explicitly */
- if (ntree->id.tag & LIB_TAG_NO_MAIN) {
+ if (ntree->id.tag & LIB_TAG_LOCALIZED) {
+ BKE_libblock_free_data(&ntree->id, true);
+ }
+}
+
+void ntreeFreeNestedTree(bNodeTree *ntree)
+{
+ ntreeFreeTree(ntree);
+ BKE_libblock_free_data(&ntree->id, true);
+}
+
+void ntreeFreeLocalTree(bNodeTree *ntree)
+{
+ if (ntree->id.tag & LIB_TAG_LOCALIZED) {
+ ntreeFreeTree(ntree);
+ }
+ else {
+ ntreeFreeTree(ntree);
BKE_libblock_free_data(&ntree->id, true);
}
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index e76b1776b25..a070bf97317 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -470,7 +470,7 @@ void BKE_scene_free_ex(Scene *sce, const bool do_id_user)
/* is no lib link block, but scene extension */
if (sce->nodetree) {
- ntreeFreeTree(sce->nodetree);
+ ntreeFreeNestedTree(sce->nodetree);
MEM_freeN(sce->nodetree);
sce->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index cdcb51f8e72..3d180bd7856 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -205,7 +205,7 @@ void BKE_texture_free(Tex *tex)
/* is no lib link block, but texture extension */
if (tex->nodetree) {
- ntreeFreeTree(tex->nodetree);
+ ntreeFreeNestedTree(tex->nodetree);
MEM_freeN(tex->nodetree);
tex->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index bab1b297637..319bc3532c2 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -68,7 +68,7 @@ void BKE_world_free(World *wrld)
/* is no lib link block, but world extension */
if (wrld->nodetree) {
- ntreeFreeTree(wrld->nodetree);
+ ntreeFreeNestedTree(wrld->nodetree);
MEM_freeN(wrld->nodetree);
wrld->nodetree = NULL;
}
diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c
index e7244f926ff..171e40deb24 100644
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@ -246,7 +246,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
/* Don't enable compositing nodes. */
if (scene->nodetree) {
- ntreeFreeTree(scene->nodetree);
+ ntreeFreeNestedTree(scene->nodetree);
MEM_freeN(scene->nodetree);
scene->nodetree = NULL;
scene->use_nodes = false;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 746ba96abf7..e4a55943999 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -714,7 +714,7 @@ GPUMaterial *GPU_material_from_nodetree(
/* Only free after GPU_pass_shader_get where GPUUniformBuffer
* read data from the local tree. */
- ntreeFreeTree(localtree);
+ ntreeFreeLocalTree(localtree);
MEM_freeN(localtree);
/* note that even if building the shader fails in some way, we still keep