DBUS Menu: fixing SIGSEV and SIGBUS when trying to use dbus.
Summary: Using of dbus menu causes a weird exception that looks like this (for example in function elm_win_main_menu_get(Evas_Object *win)): > EINA: Data at address 0x0 is invalid. Replacing with zero page. > mmap: Operation not permitted > ERR<22270>:eina_mmap lib/eina/eina_mmap.c:110 _eina_mmap_safe_sigbus() > Failed to mmap() /dev/zero in place of page. SIGBUS!!! > Aborted (core dumped) This issue appears because there is a lot of places where Elm_Object_Item is used, but it should be Elm_Menu_Item_Data. This issue could be reproduced with elementary_test: 1. run elementary test with dbus enabled. 2. find "Systray Item" button and click on it. 3. get SIGSEV in your console. @fix Reviewers: cedric, raster, seoz, Hermet Reviewed By: Hermet Subscribers: reutskiy.v.v Differential Revision: https://phab.enlightenment.org/D1681
This commit is contained in:
parent
1f550e0beb
commit
ae38b2efa9
|
@ -159,3 +159,4 @@ Jae Yong Hwang <j_yong.hwang@samsung.com>
|
|||
Kabeer Khan <kabeer.khan@samsung.com>
|
||||
yinsc <shouchen.yin@samsung.com>
|
||||
Woochan Lee <wc0917.lee@samsung.com>
|
||||
Vitalii Vorobiov <vi.vorobiov@samsung.com>
|
||||
|
|
|
@ -63,7 +63,7 @@ _menu_add_recursive(Elm_DBus_Menu *dbus_menu, Elm_Menu_Item_Data *item)
|
|||
{
|
||||
int32_t id;
|
||||
Eina_List *l;
|
||||
Elm_Menu_Item_Data *subitem;
|
||||
Elm_Object_Item *obj_subitem;
|
||||
|
||||
id = ++dbus_menu->timestamp;
|
||||
if (!eina_hash_add(dbus_menu->elements, &id, item))
|
||||
|
@ -71,8 +71,9 @@ _menu_add_recursive(Elm_DBus_Menu *dbus_menu, Elm_Menu_Item_Data *item)
|
|||
|
||||
item->dbus_idx = id;
|
||||
|
||||
EINA_LIST_FOREACH (item->submenu.items, l, subitem)
|
||||
EINA_LIST_FOREACH (item->submenu.items, l, obj_subitem)
|
||||
{
|
||||
ELM_MENU_ITEM_DATA_GET(obj_subitem, subitem);
|
||||
if (!_menu_add_recursive(dbus_menu, subitem))
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
@ -300,8 +301,8 @@ _layout_build_recursive(Elm_Menu_Item_Data *item,
|
|||
Eldbus_Message_Iter *iter)
|
||||
{
|
||||
Eina_List *l;
|
||||
Elm_Menu_Item_Data *subitem;
|
||||
Eldbus_Message_Iter *layout, *array, *variant;
|
||||
Elm_Object_Item *obj_subitem;
|
||||
|
||||
layout = eldbus_message_iter_container_new(iter, 'r', NULL);
|
||||
eldbus_message_iter_basic_append(layout, 'i', item->dbus_idx);
|
||||
|
@ -310,10 +311,11 @@ _layout_build_recursive(Elm_Menu_Item_Data *item,
|
|||
|
||||
if (recursion_depth > 0)
|
||||
{
|
||||
EINA_LIST_FOREACH (item->submenu.items, l, subitem)
|
||||
EINA_LIST_FOREACH (item->submenu.items, l, obj_subitem)
|
||||
{
|
||||
variant = eldbus_message_iter_container_new(array, 'v',
|
||||
"(ia{sv}av)");
|
||||
ELM_MENU_ITEM_DATA_GET(obj_subitem, subitem);
|
||||
_layout_build_recursive(subitem, property_list,
|
||||
recursion_depth - 1, variant);
|
||||
eldbus_message_iter_container_close(array, variant);
|
||||
|
@ -333,7 +335,7 @@ _root_layout_build(Elm_DBus_Menu *dbus_menu, Eina_List *property_list,
|
|||
const Eina_List *ret = NULL;
|
||||
Eina_List *items;
|
||||
Eina_List *l;
|
||||
Elm_Menu_Item_Data *item;
|
||||
Elm_Object_Item *obj_item;
|
||||
|
||||
layout = eldbus_message_iter_container_new(iter, 'r', NULL);
|
||||
eldbus_message_iter_basic_append(layout, 'i', 0);
|
||||
|
@ -360,10 +362,11 @@ _root_layout_build(Elm_DBus_Menu *dbus_menu, Eina_List *property_list,
|
|||
{
|
||||
eo_do(dbus_menu->menu, ret = elm_obj_menu_items_get());
|
||||
items = (Eina_List *)ret;
|
||||
EINA_LIST_FOREACH (items, l, item)
|
||||
EINA_LIST_FOREACH (items, l, obj_item)
|
||||
{
|
||||
variant = eldbus_message_iter_container_new(array, 'v',
|
||||
"(ia{sv}av)");
|
||||
"(ia{sv}av)");
|
||||
ELM_MENU_ITEM_DATA_GET(obj_item, item);
|
||||
_layout_build_recursive(item, property_list,
|
||||
recursion_depth - 1, variant);
|
||||
eldbus_message_iter_container_close(array, variant);
|
||||
|
@ -420,7 +423,7 @@ _elm_dbus_menu_add(Eo *menu)
|
|||
Elm_DBus_Menu *dbus_menu;
|
||||
const Eina_List *ret = NULL;
|
||||
Eina_List *items, *l;
|
||||
Elm_Menu_Item_Data *item;
|
||||
Elm_Object_Item *obj_item;
|
||||
|
||||
ELM_MENU_CHECK(menu) NULL;
|
||||
|
||||
|
@ -442,8 +445,9 @@ _elm_dbus_menu_add(Eo *menu)
|
|||
|
||||
eo_do(menu, ret = elm_obj_menu_items_get());
|
||||
items = (Eina_List *)ret;
|
||||
EINA_LIST_FOREACH (items, l, item)
|
||||
EINA_LIST_FOREACH (items, l, obj_item)
|
||||
{
|
||||
ELM_MENU_ITEM_DATA_GET(obj_item, item);
|
||||
if (!_menu_add_recursive(dbus_menu, item))
|
||||
{
|
||||
ERR("Unable to add menu item");
|
||||
|
|
Loading…
Reference in New Issue