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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2015-12-29 02:24:41 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2015-12-29 02:27:18 +0300
commit5b30e823a74c1fd1c1fa3e4e1fb86cda2889052b (patch)
treecfcdd12dc53731438ff2ccf83ff46bd77122b51f /source
parentd1a26437ef81d9f5fcf8c2f3ff27ae22e7a970fa (diff)
Fix invalid memory access in multiview code during render, reported on irc.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/image.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 394237f6c14..330148b3a94 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2861,21 +2861,30 @@ bool BKE_image_is_stereo(Image *ima)
BLI_findstring(&ima->views, STEREO_RIGHT_NAME, offsetof(ImageView, name)));
}
-static void image_view_from_render_view(ImageView *iv_dst, RenderView *rv_src)
-{
- BLI_strncpy(iv_dst->name, rv_src->name, sizeof(iv_dst->name));
-}
-
static void image_init_multilayer_multiview(Image *ima, RenderResult *rr)
{
+ /* update image views from render views, but only if they actually changed,
+ * to avoid invalid memory access during render. ideally these should always
+ * be acquired with a mutex along with the render result, but there are still
+ * some places with just an image pointer that need to access views */
+ if (rr && BLI_listbase_count(&ima->views) == BLI_listbase_count(&rr->views)) {
+ ImageView *iv = ima->views.first;
+ RenderView *rv = rr->views.first;
+ bool modified = false;
+ for (; rv; rv = rv->next, iv = iv->next) {
+ modified |= !STREQ(rv->name, iv->name);
+ }
+ if (!modified)
+ return;
+ }
+
BKE_image_free_views(ima);
+
if (rr) {
- RenderView *rv_src;
- for (rv_src = rr->views.first; rv_src; rv_src = rv_src->next) {
- ImageView *iv_dst;
- iv_dst = MEM_callocN(sizeof(ImageView), "Viewer Image View");
- image_view_from_render_view(iv_dst, rv_src);
- BLI_addhead(&ima->views, iv_dst);
+ for (RenderView *rv = rr->views.first; rv; rv = rv->next) {
+ ImageView *iv = MEM_callocN(sizeof(ImageView), "Viewer Image View");
+ BLI_strncpy(iv->name, rv->name, sizeof(iv->name));
+ BLI_addtail(&ima->views, iv);
}
}
}