2010-04-08 13:53:01 -07:00
|
|
|
#include <assert.h>
|
|
|
|
#include "private.h"
|
|
|
|
|
|
|
|
typedef struct _Elm_Params_List
|
|
|
|
{
|
2010-10-21 15:03:43 -07:00
|
|
|
Elm_Params base;
|
2010-04-08 13:53:01 -07:00
|
|
|
const char *policy_h;
|
|
|
|
const char *policy_v;
|
2010-10-19 13:19:12 -07:00
|
|
|
const char *mode;
|
2010-10-20 05:38:46 -07:00
|
|
|
Eina_Bool h_mode : 1;
|
|
|
|
Eina_Bool h_mode_exists : 1;
|
2010-04-08 13:53:01 -07:00
|
|
|
Eina_Bool multi : 1;
|
|
|
|
Eina_Bool multi_exists : 1;
|
|
|
|
Eina_Bool always_select : 1;
|
|
|
|
Eina_Bool always_select_exists : 1;
|
|
|
|
} Elm_Params_List;
|
|
|
|
|
2010-10-20 05:38:46 -07:00
|
|
|
#define CHOICE_GET(CHOICES, STR) \
|
|
|
|
unsigned int i; \
|
elementary - fixed some logic errors patched by rajeev.r@samsung.com
Hi all,
I found few memory related issues in elementary package when performed static analysis on it.
These issues include:
Array indices getting out of bounds, freed memory address being passed to a function as parameter, memory not getting cleaned up because of earlier return statement.
Issues details:
1. In elm_widget.c inside function elm_widget_signal_callback_del(), it is possible that freed memory address esd is passed to the sd->callback_del_func(). I think it should be data, not esd.
Moreover what if the callback frees memory for data, then the other problem is that the return value is data from the function elm_widget_signal_callback_del() which in my opinion can be a problem.
2. Inside directory src/edje_externals for files elm_genlist.c, elm_notify.c, elm_list.c, elm_thumb.c and elm_map.c, array indices can go beyound bounary.
sizeof() operator for an array of character pointers will return [number of elements in the array * size of (char*)], basically 4 times the number of elements which has been taken care in assertion inside src/edje_extenarnals
while performing assertion but has been missed in the next statement in the loop condition.
3. In file src/lib/elm_config.c inside function _elm_config_profiles_list, freeing of file iterator has been missed out.
Please review the attached patch and let me know your opinion.
Thanks.
Regards,
Rajeev
SVN revision: 63550
2011-09-22 17:02:13 -07:00
|
|
|
for (i = 0; i < (sizeof(CHOICES)/sizeof(CHOICES[0])); i++) \
|
2010-10-20 05:38:46 -07:00
|
|
|
if (strcmp(STR, CHOICES[i]) == 0) \
|
2010-04-08 13:53:01 -07:00
|
|
|
return i
|
|
|
|
|
2014-01-23 03:08:10 -08:00
|
|
|
static const char *scroller_policy_choices[] = { "auto", "on", "off", NULL };
|
|
|
|
static const char *list_mode_choices[] =
|
|
|
|
{
|
|
|
|
"compress", "scroll", "limit", "expand", NULL
|
|
|
|
};
|
2010-04-08 13:53:01 -07:00
|
|
|
|
|
|
|
static Elm_Scroller_Policy
|
|
|
|
_scroller_policy_choices_setting_get(const char *policy_str)
|
|
|
|
{
|
|
|
|
assert(sizeof(scroller_policy_choices)/
|
2010-10-20 05:38:46 -07:00
|
|
|
sizeof(scroller_policy_choices[0]) == ELM_SCROLLER_POLICY_LAST + 1);
|
2010-04-08 13:53:01 -07:00
|
|
|
CHOICE_GET(scroller_policy_choices, policy_str);
|
|
|
|
return ELM_SCROLLER_POLICY_LAST;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Elm_List_Mode
|
2010-10-19 13:19:12 -07:00
|
|
|
_list_mode_setting_get(const char *mode_str)
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-19 13:19:12 -07:00
|
|
|
assert(sizeof(list_mode_choices)/sizeof(list_mode_choices[0]) ==
|
|
|
|
ELM_LIST_LAST + 1);
|
|
|
|
CHOICE_GET(list_mode_choices, mode_str);
|
2010-04-08 13:53:01 -07:00
|
|
|
return ELM_LIST_LAST;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-01-23 03:08:10 -08:00
|
|
|
external_list_state_set(void *data EINA_UNUSED, Evas_Object *obj,
|
|
|
|
const void *from_params, const void *to_params,
|
|
|
|
float pos EINA_UNUSED)
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
|
|
|
const Elm_Params_List *p;
|
|
|
|
Elm_Scroller_Policy policy_h, policy_v;
|
|
|
|
|
|
|
|
if (to_params) p = to_params;
|
|
|
|
else if (from_params) p = from_params;
|
|
|
|
else return;
|
|
|
|
|
2010-10-19 13:19:12 -07:00
|
|
|
if (p->mode)
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
Elm_List_Mode set = _list_mode_setting_get(p->mode);
|
2010-04-29 13:26:41 -07:00
|
|
|
|
2010-10-20 05:38:46 -07:00
|
|
|
if (set != ELM_LIST_LAST)
|
|
|
|
elm_list_mode_set(obj, set);
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if ((p->policy_h) && (p->policy_v))
|
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
policy_h = _scroller_policy_choices_setting_get(p->policy_h);
|
|
|
|
policy_v = _scroller_policy_choices_setting_get(p->policy_v);
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_set(obj, policy_h, policy_v);
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
else if ((p->policy_h) || (p->policy_v))
|
|
|
|
{
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_get(obj, &policy_h, &policy_v);
|
2010-10-20 05:38:46 -07:00
|
|
|
if (p->policy_h)
|
|
|
|
{
|
|
|
|
policy_h = _scroller_policy_choices_setting_get(p->policy_h);
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_set(obj, policy_h, policy_v);
|
2010-10-20 05:38:46 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
policy_v = _scroller_policy_choices_setting_get(p->policy_v);
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_set(obj, policy_h, policy_v);
|
2010-10-20 05:38:46 -07:00
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
|
2010-10-20 05:38:46 -07:00
|
|
|
if (p->h_mode_exists)
|
|
|
|
elm_list_horizontal_set(obj, p->h_mode);
|
2010-04-08 13:53:01 -07:00
|
|
|
if (p->multi_exists)
|
|
|
|
elm_list_multi_select_set(obj, p->multi);
|
|
|
|
if (p->always_select_exists)
|
2012-03-07 07:22:12 -08:00
|
|
|
{
|
|
|
|
if (p->always_select)
|
2012-03-07 08:18:38 -08:00
|
|
|
elm_list_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_ALWAYS);
|
2012-03-07 07:22:12 -08:00
|
|
|
else
|
2012-03-07 08:18:38 -08:00
|
|
|
elm_list_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
|
2012-03-07 07:22:12 -08:00
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2014-01-23 03:08:10 -08:00
|
|
|
external_list_param_set(void *data EINA_UNUSED, Evas_Object *obj,
|
|
|
|
const Edje_External_Param *param)
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (!strcmp(param->name, "list mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
|
|
|
|
{
|
|
|
|
Elm_List_Mode set = _list_mode_setting_get(param->s);
|
|
|
|
if (set == ELM_LIST_LAST) return EINA_FALSE;
|
|
|
|
elm_list_mode_set(obj, set);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "horizontal scroll"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
|
|
|
|
{
|
|
|
|
Elm_Scroller_Policy h, v;
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_get(obj, &h, &v);
|
2010-10-20 05:38:46 -07:00
|
|
|
h = _scroller_policy_choices_setting_get(param->s);
|
|
|
|
if (h == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE;
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_set(obj, h, v);
|
2010-10-20 05:38:46 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "vertical scroll"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
|
|
|
|
{
|
|
|
|
Elm_Scroller_Policy h, v;
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_get(obj, &h, &v);
|
2010-10-20 05:38:46 -07:00
|
|
|
v = _scroller_policy_choices_setting_get(param->s);
|
|
|
|
if (v == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE;
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_set(obj, h, v);
|
2010-10-20 05:38:46 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "horizontal mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
|
|
|
|
{
|
|
|
|
elm_list_horizontal_set(obj, param->i);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "multi-select mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
|
|
|
|
{
|
|
|
|
elm_list_multi_select_set(obj, param->i);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!strcmp(param->name, "always-select mode"))
|
|
|
|
{
|
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
|
|
|
|
{
|
2012-03-07 07:22:12 -08:00
|
|
|
if (param->i)
|
2012-03-07 08:18:38 -08:00
|
|
|
elm_list_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_ALWAYS);
|
2012-03-07 07:22:12 -08:00
|
|
|
else
|
2012-03-07 08:18:38 -08:00
|
|
|
elm_list_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
|
2010-10-20 05:38:46 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ERR("unknown parameter '%s' of type '%s'",
|
|
|
|
param->name, edje_external_param_type_str(param->type));
|
|
|
|
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2014-01-23 03:08:10 -08:00
|
|
|
external_list_param_get(void *data EINA_UNUSED, const Evas_Object *obj,
|
|
|
|
Edje_External_Param *param)
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (!strcmp(param->name, "horizontal mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
|
|
|
|
{
|
|
|
|
param->i = elm_list_horizontal_get(obj);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "multi-select mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
|
|
|
|
{
|
|
|
|
param->i = elm_list_multi_select_get(obj);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "always-select mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
|
|
|
|
{
|
2012-03-07 07:22:12 -08:00
|
|
|
if (elm_list_select_mode_get (obj) ==
|
2012-03-07 08:18:38 -08:00
|
|
|
ELM_OBJECT_SELECT_MODE_ALWAYS)
|
2012-03-07 07:22:12 -08:00
|
|
|
param->i = EINA_TRUE;
|
|
|
|
else
|
|
|
|
param->i = EINA_FALSE;
|
2010-10-20 05:38:46 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-20 05:38:46 -07:00
|
|
|
else if (!strcmp(param->name, "horizontal scroll"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
|
|
|
|
{
|
|
|
|
Elm_Scroller_Policy h, v;
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_get(obj, &h, &v);
|
2010-10-20 05:38:46 -07:00
|
|
|
|
|
|
|
param->s = scroller_policy_choices[h];
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!strcmp(param->name, "vertical scroll"))
|
|
|
|
{
|
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
|
|
|
|
{
|
|
|
|
Elm_Scroller_Policy h, v;
|
2012-07-04 14:43:05 -07:00
|
|
|
elm_scroller_policy_get(obj, &h, &v);
|
2010-10-20 05:38:46 -07:00
|
|
|
|
|
|
|
param->s = scroller_policy_choices[v];
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
2010-10-19 13:19:12 -07:00
|
|
|
else if (!strcmp(param->name, "list mode"))
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
|
|
|
|
{
|
|
|
|
Elm_List_Mode m = elm_list_mode_get(obj);
|
2010-04-08 13:53:01 -07:00
|
|
|
|
2010-10-20 05:38:46 -07:00
|
|
|
if (m == ELM_LIST_LAST)
|
|
|
|
return EINA_FALSE;
|
2010-04-08 13:53:01 -07:00
|
|
|
|
2010-10-20 05:38:46 -07:00
|
|
|
param->s = list_mode_choices[m];
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ERR("unknown parameter '%s' of type '%s'",
|
|
|
|
param->name, edje_external_param_type_str(param->type));
|
|
|
|
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2014-01-23 03:08:10 -08:00
|
|
|
external_list_params_parse(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|
|
|
const Eina_List *params)
|
2010-04-08 13:53:01 -07:00
|
|
|
{
|
|
|
|
Elm_Params_List *mem;
|
|
|
|
Edje_External_Param *param;
|
|
|
|
const Eina_List *l;
|
|
|
|
|
2010-11-22 04:46:58 -08:00
|
|
|
mem = ELM_NEW(Elm_Params_List);
|
2010-04-08 13:53:01 -07:00
|
|
|
if (!mem)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(params, l, param)
|
|
|
|
{
|
2010-10-20 05:38:46 -07:00
|
|
|
if (!strcmp(param->name, "horizontal mode"))
|
|
|
|
{
|
|
|
|
mem->h_mode = param->i;
|
|
|
|
mem->h_mode_exists = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else if (!strcmp(param->name, "multi-select mode"))
|
|
|
|
{
|
|
|
|
mem->multi = param->i;
|
|
|
|
mem->multi_exists = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else if (!strcmp(param->name, "always-select mode"))
|
|
|
|
{
|
|
|
|
mem->always_select = param->i;
|
|
|
|
mem->always_select_exists = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else if (!strcmp(param->name, "horizontal scroll"))
|
|
|
|
mem->policy_h = eina_stringshare_add(param->s);
|
|
|
|
else if (!strcmp(param->name, "vertical scroll"))
|
|
|
|
mem->policy_v = eina_stringshare_add(param->s);
|
|
|
|
else if (!strcmp(param->name, "list mode"))
|
|
|
|
mem->mode = eina_stringshare_add(param->s);
|
2010-04-08 13:53:01 -07:00
|
|
|
}
|
|
|
|
return mem;
|
|
|
|
}
|
|
|
|
|
2014-01-23 03:08:10 -08:00
|
|
|
static Evas_Object *external_list_content_get(void *data EINA_UNUSED,
|
|
|
|
const Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *content EINA_UNUSED)
|
2010-08-01 10:29:20 -07:00
|
|
|
{
|
2010-10-20 05:40:36 -07:00
|
|
|
ERR("No content.");
|
2010-10-20 05:38:46 -07:00
|
|
|
return NULL;
|
2010-08-01 10:29:20 -07:00
|
|
|
}
|
|
|
|
|
2010-04-08 13:53:01 -07:00
|
|
|
static void
|
|
|
|
external_list_params_free(void *params)
|
|
|
|
{
|
|
|
|
Elm_Params_List *mem = params;
|
|
|
|
|
2010-10-19 13:19:12 -07:00
|
|
|
if (mem->mode)
|
|
|
|
eina_stringshare_del(mem->mode);
|
2010-04-08 13:53:01 -07:00
|
|
|
if (mem->policy_h)
|
|
|
|
eina_stringshare_del(mem->policy_h);
|
|
|
|
if (mem->policy_v)
|
|
|
|
eina_stringshare_del(mem->policy_v);
|
|
|
|
|
|
|
|
free(mem);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Edje_External_Param_Info external_list_params[] = {
|
2010-10-21 15:03:43 -07:00
|
|
|
DEFINE_EXTERNAL_COMMON_PARAMS,
|
2010-10-19 13:19:12 -07:00
|
|
|
EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("list mode", "scroll",
|
|
|
|
list_mode_choices),
|
2010-10-20 05:38:46 -07:00
|
|
|
EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("horizontal scroll", "auto",
|
|
|
|
scroller_policy_choices),
|
|
|
|
EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("vertical scroll", "auto",
|
|
|
|
scroller_policy_choices),
|
|
|
|
EDJE_EXTERNAL_PARAM_INFO_BOOL("horizontal mode"),
|
|
|
|
EDJE_EXTERNAL_PARAM_INFO_BOOL("multi-select mode"),
|
|
|
|
EDJE_EXTERNAL_PARAM_INFO_BOOL("always-select mode"),
|
2010-04-08 13:53:01 -07:00
|
|
|
EDJE_EXTERNAL_PARAM_INFO_SENTINEL
|
|
|
|
};
|
|
|
|
|
2014-01-23 03:08:10 -08:00
|
|
|
DEFINE_EXTERNAL_ICON_ADD(list, "list");
|
2010-04-08 13:53:01 -07:00
|
|
|
DEFINE_EXTERNAL_TYPE_SIMPLE(list, "List");
|