diff options
author | Vitalii Vorobiov <vi.vorobiov@samsung.com> | 2014-11-22 11:05:59 +0900 |
---|---|---|
committer | ChunEon Park <hermet@hermet.pe.kr> | 2014-11-22 11:08:36 +0900 |
commit | 079391717d4de6a4c6e3af34a9043ff1d07bd8a0 (patch) | |
tree | 514c0542ec87b85f85364e4921e2c0d928985dee | |
parent | d9480f540c7dbc113686400f3596d5e13e839329 (diff) | |
download | elementary-079391717d4de6a4c6e3af34a9043ff1d07bd8a0.tar.gz |
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
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | src/lib/elm_dbus_menu.c | 22 |
2 files changed, 14 insertions, 9 deletions
@@ -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> diff --git a/src/lib/elm_dbus_menu.c b/src/lib/elm_dbus_menu.c index 84a5e5937..43f270dcd 100644 --- a/src/lib/elm_dbus_menu.c +++ b/src/lib/elm_dbus_menu.c @@ -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"); |