Fix T53986: Crash saving during sculpt stroke
authorCampbell Barton <ideasman42@gmail.com>
Mon, 5 Feb 2018 06:53:30 +0000 (17:53 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 5 Feb 2018 06:54:13 +0000 (17:54 +1100)
Also remove unused struct member.

source/blender/blenkernel/BKE_paint.h
source/blender/editors/util/ed_util.c

index 8e7e69d22ca9ac83f01c7202452500a50d991b11..de2c862651ced0400970921982f14e6579dff447 100644 (file)
@@ -212,7 +212,6 @@ typedef struct SculptSession {
        /* Layer brush persistence between strokes */
        float (*layer_co)[3]; /* Copy of the mesh vertices' locations */
 
-       struct SculptStroke *stroke;
        struct StrokeCache *cache;
 
        union {
index 278b8e34311dfcd76da99d6eadebf202e05ad6ba..c920c4524a13f949a4f747f69e86c32766132e42 100644 (file)
@@ -168,7 +168,11 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render)
         * exiting we might not have a context for edit object and multiple sculpt
         * objects can exist at the same time */
        for (ob = bmain->object.first; ob; ob = ob->id.next) {
-               if (ob->mode & OB_MODE_SCULPT) {
+               if ((ob->mode & OB_MODE_SCULPT) &&
+                   /* Don't allow flushing while in the middle of a stroke (frees data in use).
+                    * Auto-save prevents this from happening but scripts may cause a flush on saving: T53986. */
+                   ((ob->sculpt && ob->sculpt->cache) == 0))
+               {
                        /* flush multires changes (for sculpt) */
                        multires_force_update(ob);
                        has_edited = true;