[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17928] branches/blender2.5/blender/source /blender: 2.5: fix for crashes due to access to free' d memory in joining areas,

Brecht Van Lommel brecht at blender.org
Thu Dec 18 20:41:36 CET 2008


Revision: 17928
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17928
Author:   blendix
Date:     2008-12-18 20:41:36 +0100 (Thu, 18 Dec 2008)

Log Message:
-----------
2.5: fix for crashes due to access to free'd memory in joining areas,
ripping areas and duplicating windows.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2008-12-18 19:21:30 UTC (rev 17927)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2008-12-18 19:41:36 UTC (rev 17928)
@@ -3649,16 +3649,25 @@
 static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata)
 {
 	uiMenuBlockHandle *menu= userdata;
+	void (*popup_func)(struct bContext *C, void *arg, int event)= NULL;
+	void *popup_arg= NULL;
+	int retval= 0;
 
 	ui_handle_menus_recursive(C, event, menu);
 
 	/* free if done, does not free handle itself */
 	if(menu->menuretval) {
+		if(menu->menuretval == UI_RETURN_OK) {
+			popup_func= menu->popup_func;
+			popup_arg= menu->popup_arg;
+			retval= menu->retvalue;
+		}
+
 		ui_menu_block_free(C, menu);
 		WM_event_remove_ui_handler(&CTX_wm_window(C)->handlers, ui_handler_popup, ui_handler_remove_popup, menu);
 
-		if(menu->menuretval == UI_RETURN_OK && menu->popup_func)
-			menu->popup_func(C, menu->popup_arg, menu->retvalue);
+		if(popup_func)
+			popup_func(C, popup_arg, retval);
 	}
 	else {
 		/* re-enable tooltips */

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-18 19:21:30 UTC (rev 17927)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-18 19:41:36 UTC (rev 17928)
@@ -264,7 +264,7 @@
 	
 	/* allocs new screen and adds to newly created window, using window size */
 	newsc= screen_add(newwin, sc->id.name+2);
-	win->screen= newsc;
+	newwin->screen= newsc;
 	
 	/* copy area to new screen */
 	area_copy_data((ScrArea *)newsc->areabase.first, sa, 0);
@@ -767,6 +767,7 @@
 	if (screen_area_join(C, CTX_wm_screen(C), sd->sarea, sd->narea)) {
 		if (CTX_wm_area(C) == sd->narea) {
 			CTX_wm_area_set(C, NULL);
+			CTX_wm_region_set(C, NULL);
 		}
 		sd->narea = NULL;
 	}
@@ -1018,6 +1019,7 @@
 	}
 	if (CTX_wm_area(C) == jd->sa2) {
 		CTX_wm_area_set(C, NULL);
+		CTX_wm_region_set(C, NULL);
 	}
 
 	return 1;

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-12-18 19:21:30 UTC (rev 17927)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-12-18 19:41:36 UTC (rev 17928)
@@ -441,6 +441,12 @@
 	return 1;
 }
 
+static int wm_event_always_pass(wmEvent *event)
+{
+	/* some events we always pass on, to ensure proper communication */
+	return (event->type == TIMER);
+}
+
 /* Warning: this function removes a modal handler, when finished */
 static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHandler *handler, wmEvent *event, IDProperty *properties)
 {
@@ -462,8 +468,15 @@
 			retval= ot->modal(C, op, event);
 
 			/* putting back screen context */
-			CTX_wm_area_set(C, area);
-			CTX_wm_region_set(C, region);
+			if((retval & OPERATOR_PASS_THROUGH) || wm_event_always_pass(event)) {
+				CTX_wm_area_set(C, area);
+				CTX_wm_region_set(C, region);
+			}
+			else {
+				/* this special cases is for areas and regions that get removed */
+				CTX_wm_area_set(C, NULL);
+				CTX_wm_region_set(C, NULL);
+			}
 			
 			if((retval & OPERATOR_FINISHED) && (ot->flag & OPTYPE_REGISTER)) {
 				wm_operator_register(CTX_wm_manager(C), op);
@@ -474,7 +487,6 @@
 				handler->op= NULL;
 			}
 			
-			
 			/* remove modal handler, operator itself should have been cancelled and freed */
 			if(retval & (OPERATOR_CANCELLED|OPERATOR_FINISHED)) {
 				BLI_remlink(handlers, handler);
@@ -524,12 +536,6 @@
 	return WM_HANDLER_CONTINUE;
 }
 
-static int wm_event_always_pass(wmEvent *event)
-{
-	/* some events we always pass on, to ensure proper communication */
-	return (event->type == TIMER);
-}
-
 static int handler_boundbox_test(wmEventHandler *handler, wmEvent *event)
 {
 	if(handler->bbwin) {





More information about the Bf-blender-cvs mailing list