efl_ui_clock: do not locally store clock module api

there is no corresponding code to unset this global pointer when the module
is unloaded, so this will crash if elm_shutdown is ever called

Signed-off-by: Mike Blumenkrantz <zmike@osg.samsung.com>
This commit is contained in:
Cedric BAIL 2018-03-13 12:40:02 -04:00
parent 067c9afa4e
commit 7c2a1932c7
1 changed files with 39 additions and 22 deletions

View File

@ -65,7 +65,6 @@ static Format_Map mapping[EFL_UI_CLOCK_TYPE_COUNT] = {
static const char *multifield_formats = "cxXrRTDF";
static const char *ignore_separators = "()";
static const char *ignore_extensions = "E0_-O^#";
static Clock_Mod_Api *dt_mod = NULL;
static const char SIG_CHANGED[] = "changed";
static const Evas_Smart_Cb_Description _smart_callbacks[] = {
@ -77,27 +76,34 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
{NULL, NULL}
};
static Elm_Module *
_dt_mod_find(void)
{
static int tried_fallback = 0;
Elm_Module *mod = _elm_module_find_as("clock/api");
if (mod) return mod;
if (!tried_fallback &&
(!_elm_config->modules || !strstr(_elm_config->modules, "clock/api")))
{
// See also _config_update(): we hardcode here the default module
ERR("Elementary config does not contain the required module "
"name for the clock widget! Verify your installation.");
_elm_module_add("clock_input_ctxpopup", "clock/api");
mod = _elm_module_find_as("clock/api");
tried_fallback = EINA_TRUE;
}
return mod;
}
static Clock_Mod_Api *
_dt_mod_init()
{
static int tried_fallback = 0;
Elm_Module *mod = NULL;
if (!(mod = _elm_module_find_as("clock/api")))
{
if (!tried_fallback &&
(!_elm_config->modules || !strstr(_elm_config->modules, "clock/api")))
{
// See also _config_update(): we hardcode here the default module
ERR("Elementary config does not contain the required module "
"name for the clock widget! Verify your installation.");
_elm_module_add("clock_input_ctxpopup", "clock/api");
mod = _elm_module_find_as("clock/api");
tried_fallback = EINA_TRUE;
}
if (!mod) return NULL;
}
Elm_Module *mod;
mod = _dt_mod_find();
if (!mod) return NULL;
if (mod->api) return mod->api;
mod->api = malloc(sizeof(Clock_Mod_Api));
if (!mod->api) return NULL;
@ -120,9 +126,11 @@ _field_list_display(Evas_Object *obj)
{
Clock_Field *field;
unsigned int idx = 0;
Clock_Mod_Api *dt_mod;
EFL_UI_CLOCK_DATA_GET(obj, sd);
dt_mod = _dt_mod_init();
if (!dt_mod || !dt_mod->field_value_display) return;
for (idx = 0; idx < EFL_UI_CLOCK_TYPE_COUNT; idx++)
@ -457,6 +465,7 @@ _efl_ui_clock_efl_ui_focus_object_on_focus_update(Eo *obj, Efl_Ui_Clock_Data *sd
if (!efl_ui_focus_object_focus_get(obj))
{
Clock_Mod_Api *dt_mod = _dt_mod_init();
if ((dt_mod) && (dt_mod->obj_hide))
dt_mod->obj_hide(sd->mod_data);
}
@ -507,12 +516,14 @@ _efl_ui_clock_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Clock_Data *sd)
Clock_Field *field;
char buf[BUFFER_SIZE];
unsigned int idx;
Clock_Mod_Api *dt_mod;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
if (!int_ret) return EFL_UI_THEME_APPLY_FAILED;
dt_mod = _dt_mod_init();
if ((!dt_mod) || (!dt_mod->field_value_display)) return EINA_TRUE;
for (idx = 0; idx < EFL_UI_CLOCK_TYPE_COUNT; idx++)
@ -804,6 +815,7 @@ _ticker(void *data)
if (sd->curr_time.tm_sec > 0)
{
Clock_Mod_Api *dt_mod = _dt_mod_init();
field = sd->field_list + EFL_UI_CLOCK_TYPE_SECOND;
if (field->fmt_exist && field->visible &&
dt_mod && dt_mod->field_value_display)
@ -823,6 +835,7 @@ EOLIAN static void
_efl_ui_clock_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Clock_Data *priv)
{
Clock_Field *field;
Clock_Mod_Api *dt_mod;
int idx;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
@ -838,7 +851,7 @@ _efl_ui_clock_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Clock_Data *priv)
CRI("Failed to set layout!");
// module - initialise module for clock
if (!dt_mod) dt_mod = _dt_mod_init();
dt_mod = _dt_mod_init();
if (dt_mod)
{
if (dt_mod->obj_hook)
@ -898,6 +911,7 @@ _efl_ui_clock_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Clock_Data *sd)
{
Clock_Field *tmp;
unsigned int idx;
Clock_Mod_Api *dt_mod;
ecore_timer_del(sd->ticker);
for (idx = 0; idx < EFL_UI_CLOCK_TYPE_COUNT; idx++)
@ -907,6 +921,7 @@ _efl_ui_clock_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Clock_Data *sd)
eina_stringshare_del(tmp->separator);
}
dt_mod = _dt_mod_init();
if ((dt_mod) && (dt_mod->obj_unhook))
dt_mod->obj_unhook(sd->mod_data); // module - unhook
@ -1008,9 +1023,11 @@ _efl_ui_clock_field_visible_set(Eo *obj, Efl_Ui_Clock_Data *sd, Efl_Ui_Clock_Typ
elm_layout_sizing_eval(obj);
if (!visible) return;
if (!dt_mod || !dt_mod->field_value_display) return;
dt_mod->field_value_display(sd->mod_data, field->item_obj);
{
Clock_Mod_Api *dt_mod = _dt_mod_init();
if (!dt_mod || !dt_mod->field_value_display) return;
dt_mod->field_value_display(sd->mod_data, field->item_obj);
}
}
EOLIAN static void