diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-07-26 22:05:17 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-07-26 22:12:54 +0400 |
commit | 698a9a2434ac3a4f87130b4013d5228e24f3a45d (patch) | |
tree | c0e34cea16f6a42accdb0db1c3d3920211b9dfb9 /source/blender/render | |
parent | 333aaca29450b0b44f1db47791cc35faa7e766c2 (diff) |
Fix T41180: Crash when using motion blur with Freestyle.
In pipeline.c, do_render_3d() is called multiple times for each frame when
motion blur is used. This caused duplicates of the same struct Render instance
in re->freestyle_renders, resulting in fatal double freeing of allocated memory.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 2131b820bd4..9e14645a732 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1935,6 +1935,8 @@ static void add_freestyle(Render *re, int render) { SceneRenderLayer *srl, *actsrl; LinkData *link; + Render *r; + const bool do_link = (re->r.mode & R_MBLUR) == 0 || re->i.curblur == re->r.mblur_samples; actsrl = BLI_findlink(&re->r.layers, re->r.actlay); @@ -1951,15 +1953,17 @@ static void add_freestyle(Render *re, int render) FRS_init_stroke_rendering(re); - for (srl= (SceneRenderLayer *)re->r.layers.first; srl; srl= srl->next) { - - link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render"); - BLI_addtail(&re->freestyle_renders, link); - + for (srl = (SceneRenderLayer *)re->r.layers.first; srl; srl = srl->next) { + if (do_link) { + link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render"); + BLI_addtail(&re->freestyle_renders, link); + } if ((re->r.scemode & R_SINGLE_LAYER) && srl != actsrl) continue; if (FRS_is_freestyle_enabled(srl)) { - link->data = (void *)FRS_do_stroke_rendering(re, srl, render); + r = FRS_do_stroke_rendering(re, srl, render); + if (do_link) + link->data = (void *)r; } } |