[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21295] branches/blender2.5/blender/source /blender/windowmanager/intern/wm_event_system.c: 2.5: Fix a case of using freed memory in event handling.

Brecht Van Lommel brecht at blender.org
Thu Jul 2 00:16:16 CEST 2009


Revision: 21295
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21295
Author:   blendix
Date:     2009-07-02 00:16:16 +0200 (Thu, 02 Jul 2009)

Log Message:
-----------
2.5: Fix a case of using freed memory in event handling.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c

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	2009-07-01 21:26:23 UTC (rev 21294)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-07-01 22:16:16 UTC (rev 21295)
@@ -733,17 +733,20 @@
 	ScrArea *area= CTX_wm_area(C);
 	ARegion *region= CTX_wm_region(C);
 	ARegion *menu= CTX_wm_menu(C);
-	int retval;
+	int retval, always_pass;
 			
 	/* we set context to where ui handler came from */
 	if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
 	if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
 	if(handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
 
+	/* in advance to avoid access to freed event on window close */
+	always_pass= wm_event_always_pass(event);
+
 	retval= handler->ui_handle(C, event, handler->ui_userdata);
 
 	/* putting back screen context */
-	if((retval != WM_UI_HANDLER_BREAK) || wm_event_always_pass(event)) {
+	if((retval != WM_UI_HANDLER_BREAK) || always_pass) {
 		CTX_wm_area_set(C, area);
 		CTX_wm_region_set(C, region);
 		CTX_wm_menu_set(C, menu);
@@ -872,6 +875,7 @@
 {
 	wmEventHandler *handler, *nexthandler;
 	int action= WM_HANDLER_CONTINUE;
+	int always_pass;
 
 	if(handlers==NULL) return action;
 	
@@ -881,6 +885,8 @@
 
 		/* optional boundbox */
 		if(handler_boundbox_test(handler, event)) {
+			/* in advance to avoid access to freed event on window close */
+			always_pass= wm_event_always_pass(event);
 		
 			/* modal+blocking handler */
 			if(handler->flag & WM_HANDLER_BLOCKING)
@@ -912,7 +918,7 @@
 				action= wm_handler_operator_call(C, handlers, handler, event, NULL);
 			}
 
-			if(!wm_event_always_pass(event) && action==WM_HANDLER_BREAK)
+			if(!always_pass && action==WM_HANDLER_BREAK)
 				break;
 		}
 		





More information about the Bf-blender-cvs mailing list