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.

Reply via email to