From 921f5208e74e309dc96d202c424a5948d8ed1ec5 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 21 Jan 2022 15:53:50 +0000 Subject: 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 534cb2f122..e405165121 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) { -- cgit v1.2.1