[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