[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36393] trunk/blender/source/blender/ editors/screen/screen_ops.c: fix crash using freed memory with SCREEN_OT_screen_set while the current screen has a full area .
Campbell Barton
ideasman42 at gmail.com
Sat Apr 30 13:28:09 CEST 2011
Revision: 36393
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36393
Author: campbellbarton
Date: 2011-04-30 11:28:09 +0000 (Sat, 30 Apr 2011)
Log Message:
-----------
fix crash using freed memory with SCREEN_OT_screen_set while the current screen has a full area.
Modified Paths:
--------------
trunk/blender/source/blender/editors/screen/screen_ops.c
Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c 2011-04-30 11:21:46 UTC (rev 36392)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c 2011-04-30 11:28:09 UTC (rev 36393)
@@ -1871,6 +1871,8 @@
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 @@
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 @@
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 @@
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;
}
More information about the Bf-blender-cvs
mailing list