Fix (unreported) crash when opening a file from splash screen when 'load UI' option is disabled.

Took me some time to figure out what was going on here... Was again that delayed button
callback stuff (`ui_apply_but_funcs_after()`), first calling button op, and then
its callback func.

Issue was that 'open file' op (through call to `WM_file_read()`) would clear
the splash screen (as more or less the entire 'dynamic' UI), but callback func of that splash
(`wm_block_splash_refreshmenu()`) would still try to access that freed menu's region.

So, root of the issue seems to be that setting context's wm/win/etc. would not clear
context's menu pointer (while clearing all other 'sub' pointers). I could not find
nor imagine any case where this behavior could be desired, so simply added nullification
of that pointer when setting context's wm/win/etc.

Note that crash was due to read-after-free, infuriating debug builds with asan,
but seems like release builds never actually crashed on it.
This commit is contained in:
Bastien Montagne 2016-02-23 16:19:59 +01:00
parent 125d5d2be5
commit 935e241fa6
Notes: blender-bot 2024-03-22 15:57:27 +01:00
Referenced by commit a0db3c3966, Fix (unreported) crash when opening a file from splash screen when 'load UI' option is disabled.
Referenced by commit 607d916f50, Fix T47632: Revert "Fix (unreported) crash when opening a file from splash screen when 'load UI' option is disabled."
Referenced by issue blender/blender-addons#47632, Redrawing dialogs
1 changed files with 5 additions and 0 deletions

View File

@ -820,6 +820,7 @@ void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
C->wm.screen = NULL;
C->wm.area = NULL;
C->wm.region = NULL;
C->wm.menu = NULL;
}
void CTX_wm_window_set(bContext *C, wmWindow *win)
@ -830,6 +831,7 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
C->data.scene = C->wm.screen->scene;
C->wm.area = NULL;
C->wm.region = NULL;
C->wm.menu = NULL;
}
void CTX_wm_screen_set(bContext *C, bScreen *screen)
@ -839,17 +841,20 @@ void CTX_wm_screen_set(bContext *C, bScreen *screen)
C->data.scene = C->wm.screen->scene;
C->wm.area = NULL;
C->wm.region = NULL;
C->wm.menu = NULL;
}
void CTX_wm_area_set(bContext *C, ScrArea *area)
{
C->wm.area = area;
C->wm.region = NULL;
C->wm.menu = NULL;
}
void CTX_wm_region_set(bContext *C, ARegion *region)
{
C->wm.region = region;
C->wm.menu = NULL;
}
void CTX_wm_menu_set(bContext *C, ARegion *menu)