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
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2019-01-25 19:54:36 +0300
committerDalai Felinto <dfelinto@gmail.com>2019-01-25 19:58:35 +0300
commitfa1d5586a1ad53cb6529d05d7dcbb7d5a22de780 (patch)
tree1affa6bf27141b9193910a051cbe8c9e44a98691 /source/blender/freestyle
parentda6bda64839e91dea4e6a7c144f8ae30e2d9076b (diff)
Fix Freestyle (ASAN detected) crash
This was very simple to reproduce, just turn on Freestyle and press render. Now to the truth of things. Most (if not all) of ~BlenderStrokeRenderer() can be removed. I believe this was done back when freestyle was using G.main, and since we gave freestyle its own main we can just leave the cleanup for later. I will leave this for freestyle maintainers to think over though. Note: There is a chance this was the issue reported on T57890. I will wait for the reporter to confirm this as fixed though.
Diffstat (limited to 'source/blender/freestyle')
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp20
1 files changed, 9 insertions, 11 deletions
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index d033e1a0133..3eaca723045 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -185,10 +185,11 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer()
// compositor has finished.
// release objects and data blocks
+ Base *base_next = NULL;
ViewLayer *view_layer = (ViewLayer *)freestyle_scene->view_layers.first;
- for (Base *b = (Base *)view_layer->object_bases.first; b; b = b->next) {
+ for (Base *b = (Base *)view_layer->object_bases.first; b; b = base_next) {
+ base_next = b->next;
Object *ob = b->object;
- void *data = ob->data;
char *name = ob->id.name;
#if 0
if (G.debug & G_DEBUG_FREESTYLE) {
@@ -196,23 +197,20 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer()
}
#endif
switch (ob->type) {
- case OB_MESH:
- BKE_id_free(freestyle_bmain, ob);
- BKE_id_free(freestyle_bmain, data);
- break;
case OB_CAMERA:
- BKE_id_free(freestyle_bmain, ob);
- BKE_id_free(freestyle_bmain, data);
freestyle_scene->camera = NULL;
+ ATTR_FALLTHROUGH;
+ case OB_MESH:
+ BKE_scene_collections_object_remove(freestyle_bmain,
+ freestyle_scene,
+ ob,
+ true);
break;
default:
cerr << "Warning: unexpected object in the scene: " << name[0] << name[1] << ":" << (name + 2) << endl;
}
}
- // Make sure we don't have any bases which might reference freed objects.
- BKE_main_collection_sync(freestyle_bmain);
-
// release materials
Link *lnk = (Link *)freestyle_bmain->mat.first;