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 d642f1068217fa8e59ca5ed3b5205c7123bec4ee
Author: [email protected] <[email protected]>
AuthorDate: Mon Mar 9 22:18:11 2026 -0600
fix(networkmanager): prevent Eldbus from canceling ListConnections call
The enm_saved_connections_get() function was unreffing the Settings
proxy and object immediately after calling ListConnections, assuming
Eldbus keeps internal refs during the pending call. However, Eldbus
actually cancels pending D-Bus calls when the proxy is freed, causing
ListConnections to always fail with org.enlightenment.DBus.Canceled.
Fix by creating a _Settings_List_Ctx struct that holds the proxy and
object alive as callback data, and freeing them inside _saved_conn_list_cb
after the reply arrives. This ensures ListConnections completes
successfully, populating the saved_connections hash and making the
forget button appear in the NetworkManager popup.
Also add error logging to _saved_conn_list_cb and _saved_conn_settings_cb
to aid debugging of D-Bus failures, and improve forget button creation
logging in _enm_ap_end_new.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
src/modules/networkmanager/e_mod_main.c | 14 +++++-
src/modules/networkmanager/e_networkmanager.c | 67 ++++++++++++++++++++-------
2 files changed, 62 insertions(+), 19 deletions(-)
diff --git a/src/modules/networkmanager/e_mod_main.c b/src/modules/networkmanager/e_mod_main.c
index 36c85b41e..3502c9ffb 100644
--- a/src/modules/networkmanager/e_mod_main.c
+++ b/src/modules/networkmanager/e_mod_main.c
@@ -191,11 +191,20 @@ _enm_ap_end_new(struct NM_Manager *nm, struct NM_Access_Point *ap, Evas *evas)
/* Only show forget for saved (known) networks */
if (!nm->saved_connections || !ap->ssid)
- return NULL;
+ {
+ DBG("forget: no hash (%p) or no ssid (%p)", nm->saved_connections, ap->ssid);
+ return NULL;
+ }
conn_path = eina_hash_find(nm->saved_connections, ap->ssid);
if (!conn_path)
- return NULL;
+ {
+ DBG("forget: ssid '%s' not in saved_connections hash (size=%d)",
+ ap->ssid, nm->saved_connections ? eina_hash_population(nm->saved_connections) : -1);
+ return NULL;
+ }
+
+ INF("forget: creating button for ssid '%s' -> %s", ap->ssid, conn_path);
end = edje_object_add(evas);
if (!e_theme_edje_object_set(end, "base/theme/modules/networkmanager",
@@ -204,6 +213,7 @@ _enm_ap_end_new(struct NM_Manager *nm, struct NM_Access_Point *ap, Evas *evas)
if (!e_theme_edje_object_set(end, "base/theme/modules/connman",
"e/modules/connman/forget"))
{
+ ERR("forget: could not load theme group");
evas_object_del(end);
return NULL;
}
diff --git a/src/modules/networkmanager/e_networkmanager.c b/src/modules/networkmanager/e_networkmanager.c
index 3ffbe6a18..515188505 100644
--- a/src/modules/networkmanager/e_networkmanager.c
+++ b/src/modules/networkmanager/e_networkmanager.c
@@ -1092,10 +1092,19 @@ _saved_conn_settings_cb(void *data, const Eldbus_Message *msg,
const char *setting_name, *key;
char ssid_str[256];
- if (eldbus_message_error_get(msg, NULL, NULL))
- goto done;
+ {
+ const char *err_name = NULL, *err_msg = NULL;
+ if (eldbus_message_error_get(msg, &err_name, &err_msg))
+ {
+ ERR("GetSettings failed: %s %s", err_name ?: "", err_msg ?: "");
+ goto done;
+ }
+ }
if (!eldbus_message_arguments_get(msg, "a{sa{sv}}", &settings))
- goto done;
+ {
+ ERR("GetSettings: failed to parse reply arguments");
+ goto done;
+ }
while (eldbus_message_iter_get_and_next(settings, 'e', &dict_entry))
{
@@ -1134,6 +1143,7 @@ _saved_conn_settings_cb(void *data, const Eldbus_Message *msg,
eina_hash_del_by_key(ctx->nm->saved_connections, ssid_str);
eina_hash_add(ctx->nm->saved_connections, ssid_str,
eina_stringshare_add(ctx->path));
+ INF("saved_conn: added '%s' -> %s", ssid_str, ctx->path);
}
goto done;
}
@@ -1152,18 +1162,40 @@ done:
free(ctx);
}
+struct _Settings_List_Ctx
+{
+ struct NM_Manager *nm;
+ Eldbus_Proxy *proxy;
+ Eldbus_Object *obj;
+};
+
static void
_saved_conn_list_cb(void *data, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
{
- struct NM_Manager *nm = data;
+ struct _Settings_List_Ctx *sctx = data;
+ struct NM_Manager *nm = sctx->nm;
Eldbus_Message_Iter *conn_array;
const char *conn_path;
- if (eldbus_message_error_get(msg, NULL, NULL))
- return;
+ /* Free the Settings proxy/obj that were kept alive for this call */
+ eldbus_proxy_unref(sctx->proxy);
+ eldbus_object_unref(sctx->obj);
+ free(sctx);
+
+ {
+ const char *err_name = NULL, *err_msg = NULL;
+ if (eldbus_message_error_get(msg, &err_name, &err_msg))
+ {
+ ERR("ListConnections failed: %s %s", err_name ?: "", err_msg ?: "");
+ return;
+ }
+ }
if (!eldbus_message_arguments_get(msg, "ao", &conn_array))
- return;
+ {
+ ERR("ListConnections: failed to parse reply");
+ return;
+ }
nm->saved_conn_pending = 0;
@@ -1199,9 +1231,6 @@ _saved_connections_free_cb(void *data)
void
enm_saved_connections_get(struct NM_Manager *nm)
{
- Eldbus_Object *settings_obj;
- Eldbus_Proxy *settings_proxy;
-
EINA_SAFETY_ON_NULL_RETURN(nm);
{
@@ -1213,13 +1242,17 @@ enm_saved_connections_get(struct NM_Manager *nm)
if (old) eina_hash_free(old);
}
- settings_obj = eldbus_object_get(conn, NM_BUS_NAME, NM_SETTINGS_PATH);
- settings_proxy = eldbus_proxy_get(settings_obj, NM_IFACE_SETTINGS);
- eldbus_proxy_call(settings_proxy, "ListConnections",
- _saved_conn_list_cb, nm, -1, "");
- /* Unref immediately — Eldbus holds internal refs during the pending call */
- eldbus_proxy_unref(settings_proxy);
- eldbus_object_unref(settings_obj);
+ {
+ struct _Settings_List_Ctx *sctx = malloc(sizeof(*sctx));
+ EINA_SAFETY_ON_NULL_RETURN(sctx);
+
+ sctx->nm = nm;
+ sctx->obj = eldbus_object_get(conn, NM_BUS_NAME, NM_SETTINGS_PATH);
+ sctx->proxy = eldbus_proxy_get(sctx->obj, NM_IFACE_SETTINGS);
+ eldbus_proxy_call(sctx->proxy, "ListConnections",
+ _saved_conn_list_cb, sctx, -1, "");
+ /* proxy and obj are kept alive until _saved_conn_list_cb fires */
+ }
}
static void
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.