hermet pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=079391717d4de6a4c6e3af34a9043ff1d07bd8a0

commit 079391717d4de6a4c6e3af34a9043ff1d07bd8a0
Author: Vitalii Vorobiov <[email protected]>
Date:   Sat Nov 22 11:05:59 2014 +0900

    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
---
 AUTHORS                 |  1 +
 src/lib/elm_dbus_menu.c | 22 +++++++++++++---------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index ec475be..7b1f314 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -159,3 +159,4 @@ Jae Yong Hwang <[email protected]>
 Kabeer Khan <[email protected]>
 yinsc <[email protected]>
 Woochan Lee <[email protected]>
+Vitalii Vorobiov <[email protected]>
diff --git a/src/lib/elm_dbus_menu.c b/src/lib/elm_dbus_menu.c
index 84a5e59..43f270d 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");

-- 


Reply via email to