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
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2018-08-02 07:34:27 +0300
committerJoshua Leung <aligorith@gmail.com>2018-08-02 07:35:43 +0300
commit503866c68154ef09e6199068391515f81eebaa2d (patch)
tree1bac2734895793b49b69fb51e78508e2806abcea /source/blender/editors/gpencil/annotate_paint.c
parent0fdd058991afe68d4cabd60b8d936b6ae8266524 (diff)
Fix T56199: Crash on Annotation in (VSE) Image Preview
In some cases (e.g. using old userpref settings/keymaps) it was possible to trigger a crash when the wrong GP/Annotation operators were triggered in the wrong contexts (e.g. using the old GPENCIL_OT_paint in annotation-only contexts like all the 2D editors). This commit resolves several issues that were caused by sloppy code-churn + features that had been hacked on.
Diffstat (limited to 'source/blender/editors/gpencil/annotate_paint.c')
-rw-r--r--source/blender/editors/gpencil/annotate_paint.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index 6325052fccd..b551f3d630b 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -1206,9 +1206,19 @@ static tGPsdata *gp_session_initpaint(bContext *C)
/* create new context data */
p = MEM_callocN(sizeof(tGPsdata), "Annotation Drawing Data");
- gp_session_initdata(C, p);
+ /* Try to initialise context data
+ * WARNING: This may not always succeed (e.g. using GP in an annotation-only context)
+ */
+ if (gp_session_initdata(C, p) == 0) {
+ /* Invalid state - Exit
+ * NOTE: It should be safe to just free the data, since failing context checks should
+ * only happen when no data has been allocated.
+ */
+ MEM_freeN(p);
+ return NULL;
+ }
- /* radius for eraser circle is defined in userprefs now */
+ /* Radius for eraser circle is defined in userprefs */
/* NOTE: we do this here, so that if we exit immediately,
* erase size won't get lost
*/
@@ -1548,9 +1558,6 @@ static void gpencil_draw_exit(bContext *C, wmOperator *op)
{
tGPsdata *p = op->customdata;
- /* clear undo stack */
- gpencil_undo_finish();
-
/* restore cursor to indicate end of drawing */
WM_cursor_modal_restore(CTX_wm_window(C));
@@ -1568,10 +1575,14 @@ static void gpencil_draw_exit(bContext *C, wmOperator *op)
*/
U.gp_eraser = p->radius;
+ /* clear undo stack */
+ gpencil_undo_finish();
+
/* cleanup */
gp_paint_cleanup(p);
gp_session_cleanup(p);
gp_session_free(p);
+ p = NULL;
}
op->customdata = NULL;