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 ceec22baa71322450b157c902764e1fc07fc27c1
Author: [email protected] <[email protected]>
AuthorDate: Thu Mar 5 19:51:32 2026 -0700

    fix: resolve NetworkManager code review issues
    
    Fix five critical bugs identified in code review that prevented proper
    device state tracking, caused crashes on cleanup, and left stale state
    in the UI:
    
    - Fix device state signal handler: PropertiesChanged was incorrectly
      wired to expect uuu format (StateChanged) instead of sa{sv}as format.
      Implemented proper PropertiesChanged parser to extract State property.
    
    - Fix double-unref crash: wireless_proxy and device proxy share the same
      Eldbus_Object. Both cleanup paths were dereferencing it, causing crash
      on WiFi device removal. Only unref the wireless proxy; object cleanup
      is handled by the main device proxy reference.
    
    - Refresh UI on AP signal strength changes: _ap_prop_changed updated
      internal RSSI/flags state but never notified the UI. Added call to
      enm_mod_manager_update to trigger popup refresh.
    
    - Clear stale connection state on disconnect: When all active connections
      dropped (empty array), active_ap_path, active_connection_path, and
      ip_address remained set, showing phantom connected state. Added cleanup
      in both _manager_prop_changed and _manager_get_props_cb for empty case.
    
    - Fix null pointer dereference in popup update: e_widget_check_checked_set
      call was outside the ctxt null guard, using potentially garbage state
      value. Moved the call inside the null check.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 src/modules/networkmanager/e_mod_main.c       |  7 ++--
 src/modules/networkmanager/e_networkmanager.c | 58 ++++++++++++++++++++-------
 2 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/src/modules/networkmanager/e_mod_main.c b/src/modules/networkmanager/e_mod_main.c
index af2040838..28873f4a6 100644
--- a/src/modules/networkmanager/e_mod_main.c
+++ b/src/modules/networkmanager/e_mod_main.c
@@ -199,9 +199,10 @@ _enm_popup_update(struct NM_Manager *nm, E_NM_Instance *inst)
    e_widget_ilist_go(list);
 
    if (inst->ctxt)
-     inst->ctxt->wireless_enabled = nm->wireless_enabled ? 1 : 0;
-
-   e_widget_check_checked_set(enabled, inst->ctxt->wireless_enabled);
+     {
+        inst->ctxt->wireless_enabled = nm->wireless_enabled ? 1 : 0;
+        e_widget_check_checked_set(enabled, inst->ctxt->wireless_enabled);
+     }
 }
 
 static void
diff --git a/src/modules/networkmanager/e_networkmanager.c b/src/modules/networkmanager/e_networkmanager.c
index 5af67805a..64b61b76d 100644
--- a/src/modules/networkmanager/e_networkmanager.c
+++ b/src/modules/networkmanager/e_networkmanager.c
@@ -219,6 +219,8 @@ _ap_prop_changed(void *data, const Eldbus_Message *msg)
                ap->rsn_flags = flags;
           }
      }
+
+   enm_mod_manager_update(nm_manager);
 }
 
 static struct NM_Access_Point *
@@ -345,19 +347,32 @@ _device_ap_removed(void *data, const Eldbus_Message *msg)
 }
 
 static void
-_device_state_changed(void *data, const Eldbus_Message *msg)
+_device_prop_changed(void *data, const Eldbus_Message *msg)
 {
    struct NM_Device *dev = data;
-   uint32_t new_state, old_state, reason;
+   Eldbus_Message_Iter *changed_props, *invalidated, *dict, *var;
+   const char *iface, *key;
 
-   if (!eldbus_message_arguments_get(msg, "uuu",
-                                     &new_state, &old_state, &reason))
+   if (!eldbus_message_arguments_get(msg, "sa{sv}as",
+                                     &iface, &changed_props, &invalidated))
      return;
 
-   DBG("Device %s state %u -> %u (reason %u)", dev->path,
-       old_state, new_state, reason);
-   dev->state = new_state;
-   enm_mod_manager_update(nm_manager);
+   while (eldbus_message_iter_get_and_next(changed_props, 'e', &dict))
+     {
+        if (!eldbus_message_iter_arguments_get(dict, "sv", &key, &var))
+          continue;
+
+        if (!strcmp(key, "State"))
+          {
+             uint32_t state;
+             if (eldbus_message_iter_arguments_get(var, "u", &state))
+               {
+                  dev->state = state;
+                  DBG("Device %s state -> %u", dev->path, state);
+                  enm_mod_manager_update(nm_manager);
+               }
+          }
+     }
 }
 
 static void
@@ -454,7 +469,7 @@ _device_new(const char *path)
    dev->proxy = eldbus_proxy_get(obj, NM_IFACE_PROPS);
 
    eldbus_proxy_signal_handler_add(dev->proxy, "PropertiesChanged",
-                                   _device_state_changed, dev);
+                                   _device_prop_changed, dev);
 
    dev->pending.get_props = eldbus_proxy_call(dev->proxy, "GetAll",
                                               _device_get_props_cb, dev,
@@ -487,11 +502,7 @@ _device_free(struct NM_Device *dev)
    free(dev->interface);
 
    if (dev->wireless_proxy)
-     {
-        obj = eldbus_proxy_object_get(dev->wireless_proxy);
-        eldbus_proxy_unref(dev->wireless_proxy);
-        eldbus_object_unref(obj);
-     }
+     eldbus_proxy_unref(dev->wireless_proxy);
 
    if (dev->proxy)
      {
@@ -726,6 +737,16 @@ _manager_prop_changed(void *data, const Eldbus_Message *msg)
              /* Use first active connection */
              if (eldbus_message_iter_get_and_next(conn_array, 'o', &aconn_path))
                _manager_check_active_connections(nm, aconn_path);
+             else
+               {
+                  eina_stringshare_del(nm->active_ap_path);
+                  nm->active_ap_path = NULL;
+                  eina_stringshare_del(nm->active_connection_path);
+                  nm->active_connection_path = NULL;
+                  free(nm->ip_address);
+                  nm->ip_address = NULL;
+                  enm_mod_manager_update(nm);
+               }
           }
      }
 }
@@ -782,6 +803,15 @@ _manager_get_props_cb(void *data, const Eldbus_Message *msg,
 
              if (eldbus_message_iter_get_and_next(conn_array, 'o', &aconn_path))
                _manager_check_active_connections(nm, aconn_path);
+             else
+               {
+                  eina_stringshare_del(nm->active_ap_path);
+                  nm->active_ap_path = NULL;
+                  eina_stringshare_del(nm->active_connection_path);
+                  nm->active_connection_path = NULL;
+                  free(nm->ip_address);
+                  nm->ip_address = NULL;
+               }
           }
      }
 

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

Reply via email to