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:
authorCampbell Barton <ideasman42@gmail.com>2011-04-30 15:28:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-04-30 15:28:09 +0400
commitdfa69dad3a694122ff7efb6a5cca70c92e37255a (patch)
tree54867cd95959a5898b6369ca6c426bed904509c1 /source/blender/editors/screen
parentd2c5aa5e7109e0843cba171b82dd648cb4aadb23 (diff)
fix crash using freed memory with SCREEN_OT_screen_set while the current screen has a full area.
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r--source/blender/editors/screen/screen_ops.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 56a27da54df..b5f980ab7cb 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1871,6 +1871,8 @@ static void SCREEN_OT_keyframe_jump(wmOperatorType *ot)
static int screen_set_exec(bContext *C, wmOperator *op)
{
bScreen *screen= CTX_wm_screen(C);
+ bScreen *screen_prev= screen;
+
ScrArea *sa= CTX_wm_area(C);
int tot= BLI_countlist(&CTX_data_main(C)->screen);
int delta= RNA_int_get(op->ptr, "delta");
@@ -1879,15 +1881,11 @@ static int screen_set_exec(bContext *C, wmOperator *op)
if(screen->temp)
return OPERATOR_CANCELLED;
- /* return to previous state before switching screens */
- if(sa && sa->full)
- ED_screen_full_restore(C, sa);
-
if(delta==1) {
while(tot--) {
screen= screen->id.next;
if(screen==NULL) screen= CTX_data_main(C)->screen.first;
- if(screen->winid==0 && screen->full==0)
+ if(screen->winid==0 && screen->full==0 && screen != screen_prev)
break;
}
}
@@ -1895,7 +1893,7 @@ static int screen_set_exec(bContext *C, wmOperator *op)
while(tot--) {
screen= screen->id.prev;
if(screen==NULL) screen= CTX_data_main(C)->screen.last;
- if(screen->winid==0 && screen->full==0)
+ if(screen->winid==0 && screen->full==0 && screen != screen_prev)
break;
}
}
@@ -1903,7 +1901,12 @@ static int screen_set_exec(bContext *C, wmOperator *op)
screen= NULL;
}
- if(screen) {
+ if(screen && screen_prev != screen) {
+ /* return to previous state before switching screens */
+ if(sa && sa->full) {
+ ED_screen_full_restore(C, sa); /* may free 'screen_prev' */
+ }
+
ED_screen_set(C, screen);
return OPERATOR_FINISHED;
}