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.