This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository enlightenment.

View the commit online.

commit 9d9dc290225cab64a8bcfa351938586bdbb36663
Author: Carsten Haitzler <ras...@rasterman.com>
AuthorDate: Mon Feb 10 16:37:20 2025 +0000

    systray + dbus menu - fix mem access - bad ref/unreffing
    
    so only ref/unref the toplevel menu as that is all we should have to
    deal with and this actually fixes a complex interaction where we
    eventually unref already unreffed menu items later.
    
    @fix
---
 src/bin/e_dbusmenu.c                           | 13 +++++--------
 src/modules/systray/e_mod_notifier_host.c      | 16 +++++++++-------
 src/modules/systray/e_mod_notifier_host_dbus.c |  4 +---
 3 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/src/bin/e_dbusmenu.c b/src/bin/e_dbusmenu.c
index 1dfa49414..e48568b3e 100644
--- a/src/bin/e_dbusmenu.c
+++ b/src/bin/e_dbusmenu.c
@@ -177,18 +177,15 @@ parse_layout(Eldbus_Message_Iter *layout, E_DBusMenu_Item *parent, E_DBusMenu_Ct
 static void
 dbus_menu_free(E_DBusMenu_Item *m)
 {
-   Eina_Inlist *inlist;
    E_DBusMenu_Item *child;
 
-   EINA_INLIST_FOREACH_SAFE(m->sub_items, inlist, child)
+   while (m->sub_items)
      {
-        e_dbusmenu_item_unref(child);
-     }
-   EINA_INLIST_FREE(m->sub_items, child)
-     {
-        m->sub_items = eina_inlist_remove
-          (m->sub_items, EINA_INLIST_GET(child));
+        child = (E_DBusMenu_Item *)m->sub_items;
+
+        m->sub_items = eina_inlist_remove(m->sub_items, m->sub_items);
         child->parent = NULL;
+        e_dbusmenu_item_unref(child);
      }
    if (m->icon_name) eina_stringshare_del(m->icon_name);
    if (m->label) eina_stringshare_del(m->label);
diff --git a/src/modules/systray/e_mod_notifier_host.c b/src/modules/systray/e_mod_notifier_host.c
index de6a670b1..520a0ba83 100644
--- a/src/modules/systray/e_mod_notifier_host.c
+++ b/src/modules/systray/e_mod_notifier_host.c
@@ -46,7 +46,7 @@ systray_notifier_item_free(Notifier_Item *item)
         free(ii);
         systray_size_updated(host_inst->inst);
      }
-   if (item->menu_path)
+   if (item->menu_data)
      e_dbusmenu_unload(item->menu_data);
    eina_stringshare_del(item->bus_id);
    eina_stringshare_del(item->path);
@@ -191,18 +191,18 @@ _menu_post_deactivate(void *data, E_Menu *m)
         e_object_data_set(E_OBJECT(m), NULL);
         e_dbusmenu_item_unref(item);
      }
-
-   if (gadcon) e_gadcon_locked_set(gadcon, 0);
    EINA_LIST_FOREACH(m->items, iter, mi)
      {
         item = e_object_data_get(E_OBJECT(mi));
         if (item)
           {
              e_object_data_set(E_OBJECT(m), NULL);
-             e_dbusmenu_item_unref(item);
           }
         if (mi->submenu) e_menu_deactivate(mi->submenu);
      }
+
+   if (gadcon) e_gadcon_locked_set(gadcon, 0);
+
    EINA_INLIST_FOREACH(ctx->instances, host_inst)
      {
         Notifier_Item_Icon *ii;
@@ -226,8 +226,11 @@ _item_submenu_new(E_DBusMenu_Item *item, E_Menu_Item *mi)
    E_Menu_Item *submi;
 
    m = e_menu_new();
-   e_dbusmenu_item_ref(item);
-   e_object_data_set(E_OBJECT(m), item);
+   if (mi == NULL)
+     {
+        e_dbusmenu_item_ref(item);
+        e_object_data_set(E_OBJECT(m), item);
+     }
    e_menu_post_deactivate_callback_set(m, _menu_post_deactivate, NULL);
    if (mi) e_menu_item_submenu_set(mi, m);
 
@@ -235,7 +238,6 @@ _item_submenu_new(E_DBusMenu_Item *item, E_Menu_Item *mi)
      {
         if (!child->visible) continue;
         submi = e_menu_item_new(m);
-        e_dbusmenu_item_ref(child);
         e_object_data_set(E_OBJECT(submi), child);
         if (child->type == E_DBUSMENU_ITEM_TYPE_SEPARATOR)
           e_menu_item_separator_set(submi, 1);
diff --git a/src/modules/systray/e_mod_notifier_host_dbus.c b/src/modules/systray/e_mod_notifier_host_dbus.c
index b2add4021..5be39e8fc 100644
--- a/src/modules/systray/e_mod_notifier_host_dbus.c
+++ b/src/modules/systray/e_mod_notifier_host_dbus.c
@@ -217,7 +217,7 @@ props_changed(void *data, const Eldbus_Message *msg)
      {
         Eldbus_Connection *conn = eldbus_object_connection_get(eldbus_proxy_object_get(item->proxy));
         item->dbus_item = NULL;
-        e_dbusmenu_unload(item->menu_data);
+        if (item->menu_data) e_dbusmenu_unload(item->menu_data);
         item->menu_data = e_dbusmenu_load(conn, item->bus_id, item->menu_path,
                                           item);
         e_dbusmenu_update_cb_set(item->menu_data, systray_notifier_update_menu);
@@ -582,8 +582,6 @@ void systray_notifier_dbus_shutdown(Context_Notifier_Host *ctx)
    Eina_Inlist *safe_list;
    Notifier_Item *item;
 
-   ERR("systray_notifier_dbus_shutdown");
-
    EINA_INLIST_FOREACH_SAFE(ctx->item_list, safe_list, item)
      systray_notifier_item_free(item);
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to