[Bf-blender-cvs] [f98cab1] workspaces: Remove temp workspace when closing temp window (e.g. UserPrefs)

Julian Eisel noreply at git.blender.org
Fri Dec 23 20:42:09 CET 2016


Commit: f98cab1c4ba2633fe0f3793bca713fae21685ce2
Author: Julian Eisel
Date:   Fri Dec 23 20:39:14 2016 +0100
Branches: workspaces
https://developer.blender.org/rBf98cab1c4ba2633fe0f3793bca713fae21685ce2

Remove temp workspace when closing temp window (e.g. UserPrefs)

The active screen of the workspace was freed which caused use-after-free in some corner-cases. Now workspace, workspace layout and the screen are deleted correctly.

===================================================================

M	source/blender/windowmanager/intern/wm_window.c

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index bb74466..7ca6596 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -328,7 +328,8 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
 	}
 	else {
 		bScreen *screen = WM_window_get_active_screen(win);
-		
+		WorkSpace *workspace = win->workspace;
+
 		BLI_remlink(&wm->windows, win);
 		
 		wm_draw_window_clear(win);
@@ -348,7 +349,10 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
 		/* if temp screen, delete it after window free (it stops jobs that can access it) */
 		if (screen && screen->temp) {
 			Main *bmain = CTX_data_main(C);
-			BKE_libblock_free(bmain, screen);
+			WorkSpaceLayout *layout = BKE_workspace_active_layout_get(workspace);
+
+			BKE_workspace_layout_remove(workspace, layout, bmain);
+			BKE_libblock_free(bmain, workspace);
 		}
 	}
 }




More information about the Bf-blender-cvs mailing list