summaryrefslogtreecommitdiff
path: root/libnm
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-10-12 10:33:03 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2016-10-14 10:44:18 +0200
commit0a61317870ac194b02dd193eca4e837aed211ebb (patch)
tree5bd44d6a8f33a9e6dec8603fc4747aaf8c0aa45c /libnm
parentc4325f64941047c74c37a876520e56a2ddb85faf (diff)
downloadNetworkManager-0a61317870ac194b02dd193eca4e837aed211ebb.tar.gz
libnm: disconnect devices' signals when disposing manager
We connect signal handlers to devices when they appear, but don't disconnect the handlers when the manager instance is destroyed. This can cause crashes as device_ac_changed() is called on an invalid manager instance. Disconnect the handlers from dispose(). https://bugzilla.redhat.com/show_bug.cgi?id=1383758
Diffstat (limited to 'libnm')
-rw-r--r--libnm/nm-manager.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/libnm/nm-manager.c b/libnm/nm-manager.c
index d9d21b823d..01ed4fa50a 100644
--- a/libnm/nm-manager.c
+++ b/libnm/nm-manager.c
@@ -1201,12 +1201,11 @@ free_devices (NMManager *manager, gboolean in_dispose)
if (in_dispose) {
priv->devices = NULL;
priv->all_devices = NULL;
- return;
+ } else {
+ priv->devices = g_ptr_array_new_with_free_func (g_object_unref);
+ priv->all_devices = g_ptr_array_new_with_free_func (g_object_unref);
}
- priv->devices = g_ptr_array_new_with_free_func (g_object_unref);
- priv->all_devices = g_ptr_array_new_with_free_func (g_object_unref);
-
if (all_devices && all_devices->len > 0)
devices = all_devices;
else if (real_devices && real_devices->len > 0)
@@ -1222,14 +1221,23 @@ free_devices (NMManager *manager, gboolean in_dispose)
goto next;
}
}
- g_signal_emit (manager, signals[DEVICE_REMOVED], 0, d);
+ if (in_dispose)
+ device_removed (manager, d);
+ else
+ g_signal_emit (manager, signals[DEVICE_REMOVED], 0, d);
next:
;
}
}
if (devices) {
- for (i = 0; i < devices->len; i++)
- g_signal_emit (manager, signals[DEVICE_REMOVED], 0, devices->pdata[i]);
+ for (i = 0; i < devices->len; i++) {
+ NMDevice *d = devices->pdata[i];
+
+ if (in_dispose)
+ device_removed (manager, d);
+ else
+ g_signal_emit (manager, signals[DEVICE_REMOVED], 0, d);
+ }
}
}