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.