bugfix [#24508] Render and changing scenes crashes.

The scenes 'Render' is kept by blender while blender runs but the callbacks were not cleared when the render was done.
In this case the callback would reference a freed render job.

This isn't normally a problem because on re-rendering new callbacks are set, however the sequencer can render a previously rendered scene without setting up callbacks.
Simple fix is to to dummy callbacks applied onto the scenes 'Render' struct once its finished.
This commit is contained in:
Campbell Barton 2010-11-03 11:14:02 +00:00
parent c31536fc53
commit 1f2469d992
3 changed files with 20 additions and 6 deletions

@ -575,6 +575,10 @@ static void render_endjob(void *rjv)
{
RenderJob *rj= rjv;
/* this render may be used again by the sequencer without the active 'Render' where the callbacks
* would be re-assigned. assign dummy callbacks to avoid referencing freed renderjobs bug [#24508] */
RE_InitRenderCB(rj->re);
if(rj->main != G.main)
free_main(rj->main);

@ -159,6 +159,9 @@ struct Render *RE_GetRender(const char *name);
/* returns 1 while render is working (or renders called from within render) */
int RE_RenderInProgress(struct Render *re);
/* assign default dummy callbacks */
void RE_InitRenderCB(struct Render *re);
/* use free render as signal to do everything over (previews) */
void RE_FreeRender (struct Render *re);
/* only called on exit */

@ -1158,6 +1158,18 @@ Render *RE_NewRender(const char *name)
BLI_rw_mutex_init(&re->resultmutex);
}
RE_InitRenderCB(re);
/* init some variables */
re->ycor= 1.0f;
return re;
}
/* called for new renders and when finishing rendering so
* we calways have valid callbacks on a render */
void RE_InitRenderCB(Render *re)
{
/* set default empty callbacks */
re->display_init= result_nothing;
re->display_clear= result_nothing;
@ -1171,11 +1183,6 @@ Render *RE_NewRender(const char *name)
re->stats_draw= stats_nothing;
/* clear callback handles */
re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL;
/* init some variables */
re->ycor= 1.0f;
return re;
}
/* only call this while you know it will remove the link too */