raster pushed a commit to branch v-0.25.0. http://git.enlightenment.org/core/enlightenment.git/commit/?id=7c0d3f2e2f01a120f1e9b0a97afc1388f7e02b27
commit 7c0d3f2e2f01a120f1e9b0a97afc1388f7e02b27 Author: Carsten Haitzler <[email protected]> Date: Fri Jan 21 15:53:50 2022 +0000 xkb config - fix segv on close advanced mode dialog didnt remove the lists with del callbacks that accessed the cfdata struct to set lisrts to null on del before cfdata was freed... callback hell. yay. @fix --- src/modules/xkbswitch/e_mod_config.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c index 534cb2f12..e40516512 100644 --- a/src/modules/xkbswitch/e_mod_config.c +++ b/src/modules/xkbswitch/e_mod_config.c @@ -232,9 +232,7 @@ _create_data(E_Config_Dialog *cfd) static void _list_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { - Evas_Object **o; - - o = data; + Evas_Object **o = data; *o = NULL; } @@ -246,12 +244,29 @@ _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) _xkb.cfd = NULL; - if (cfdata->compose_list) - evas_object_event_callback_del(cfdata->compose_list, EVAS_CALLBACK_DEL, _list_del); - if (cfdata->lv3_list) - evas_object_event_callback_del(cfdata->lv3_list, EVAS_CALLBACK_DEL, _list_del); - if (cfdata->switch_list) - evas_object_event_callback_del(cfdata->switch_list, EVAS_CALLBACK_DEL, _list_del); +#define FRAME_DEL(list) \ + if (list) { \ + evas_object_del(list); \ + list = NULL; \ + } + FRAME_DEL(cfdata->compose_list); + FRAME_DEL(cfdata->lv3_list); + FRAME_DEL(cfdata->switch_list); + FRAME_DEL(cfdata->led_list); + FRAME_DEL(cfdata->ctrl_list); + FRAME_DEL(cfdata->keypad_list); + FRAME_DEL(cfdata->delkeypad_list); + FRAME_DEL(cfdata->capslock_list); + FRAME_DEL(cfdata->altwin_list); + FRAME_DEL(cfdata->currency_list); + FRAME_DEL(cfdata->lv5_list); + FRAME_DEL(cfdata->spacebar_list); + FRAME_DEL(cfdata->japan_list); + FRAME_DEL(cfdata->korean_list); + FRAME_DEL(cfdata->esperanto_list); + FRAME_DEL(cfdata->solaris_list); + FRAME_DEL(cfdata->terminate_list); + FRAME_DEL(cfdata->misc_list); EINA_LIST_FREE(cfdata->cfg_layouts, cl) { --
