Fix T46565: Movie render crash w/o permissions

Rendering to a path that didn't have write permissions would crash.

Also fix error where `G.is_rendering` was left set when rendering failed.
This commit is contained in:
Campbell Barton 2015-10-22 16:48:38 +11:00
parent 85072eb4e9
commit c6d98fa841
Notes: blender-bot 2023-02-14 10:04:50 +01:00
Referenced by issue #46565, Segfault when rendering AVI animation to /tmp
3 changed files with 35 additions and 19 deletions

View File

@ -1063,6 +1063,11 @@ AviError AVI_close_compress(AviMovie *movie)
{
int temp, movi_size, i;
if (movie->fp == NULL) {
/* none of the allocations below were done if the file failed to open */
return AVI_ERROR_FOUND;
}
fseek(movie->fp, 0L, SEEK_END);
movi_size = (int)ftell(movie->fp);

View File

@ -215,8 +215,6 @@ static int start_avi(void *context_v, Scene *UNUSED(scene), RenderData *rd, int
if (AVI_open_compress(name, avi, 1, format) != AVI_ERROR_NONE) {
BKE_report(reports, RPT_ERROR, "Cannot open or start AVI movie file");
MEM_freeN(avi);
avi = NULL;
return 0;
}

View File

@ -3486,6 +3486,18 @@ static void get_videos_dimensions(Render *re, RenderData *rd, size_t *r_width, s
BKE_scene_multiview_videos_dimensions_get(rd, width, height, r_width, r_height);
}
static void re_movie_free_all(Render *re, bMovieHandle *mh, size_t totvideos)
{
size_t i;
for (i = 0; i < totvideos; i++) {
mh->end_movie(re->movie_ctx_arr[i]);
mh->context_free(re->movie_ctx_arr[i]);
}
MEM_SAFE_FREE(re->movie_ctx_arr);
}
/* saves images to disk */
void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_override,
unsigned int lay_override, int sfra, int efra, int tfra)
@ -3510,15 +3522,10 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
BKE_report(re->reports, RPT_ERROR, "Frame Server only support stereo output for multiview rendering");
return;
}
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
/* is also set by caller renderwin.c */
G.is_rendering = true;
re->flag |= R_ANIMATION;
if (is_movie) {
size_t i, width, height;
bool is_error = false;
get_videos_dimensions(re, &rd, &width, &height);
@ -3535,11 +3542,25 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
re->movie_ctx_arr[i] = mh->context_create();
if (!mh->start_movie(re->movie_ctx_arr[i], scene, &re->r, width, height, re->reports, false, suffix))
G.is_break = true;
if (!mh->start_movie(re->movie_ctx_arr[i], scene, &re->r, width, height, re->reports, false, suffix)) {
is_error = true;
break;
}
}
if (is_error) {
/* report is handled above */
re_movie_free_all(re, mh, i + 1);
return;
}
}
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
/* is also set by caller renderwin.c */
G.is_rendering = true;
re->flag |= R_ANIMATION;
if (mh && mh->get_next_frame) {
/* MULTIVIEW_TODO:
* in case a new video format is added that implements get_next_frame multiview has to be addressed
@ -3723,15 +3744,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
/* end movie */
if (is_movie) {
size_t i;
for (i = 0; i < totvideos; i++) {
mh->end_movie(re->movie_ctx_arr[i]);
mh->context_free(re->movie_ctx_arr[i]);
}
if (re->movie_ctx_arr) {
MEM_freeN(re->movie_ctx_arr);
}
re_movie_free_all(re, mh, totvideos);
}
if (totskipped && totrendered == 0)