summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2018-05-14 17:22:43 +0200
committerLubomir Rintel <lkundrak@v3.sk>2018-05-14 17:25:26 +0200
commita2252eb461a682e98746f0837014863a814ca5c1 (patch)
tree81ce25dab7a4aab403c3ed7ab02b8cc2dba04abd
parent320422e4cf47e6ea36023294fa926f8c8c99d127 (diff)
platform: clean up wifi_data for interface when it goes awaylr/wifi-data
Otherwise we just leak WifiData structures and even pile up open genlink sockets.
-rw-r--r--src/platform/nm-linux-platform.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 3a671acf7..b9c90ec6a 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -7163,6 +7163,29 @@ finalize (GObject *object)
}
static void
+link_changed_cb (NMPlatform *platform,
+ int obj_type_i,
+ int ifindex,
+ NMPlatformLink *info,
+ int change_type_i,
+ gpointer user_data)
+{
+ const NMPlatformSignalChangeType change_type = change_type_i;
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPlatformLink *pllink;
+
+ g_signal_chain_from_overridden_handler (platform, obj_type_i, ifindex,
+ info, change_type_i, user_data);
+
+ if (change_type != NM_PLATFORM_SIGNAL_REMOVED)
+ return;
+
+ pllink = nm_platform_link_get (platform, ifindex);
+ if (pllink->type == NM_LINK_TYPE_WIFI || pllink->type == NM_LINK_TYPE_OLPC_MESH)
+ g_hash_table_remove (priv->wifi_data, GINT_TO_POINTER (ifindex));
+}
+
+static void
nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -7258,5 +7281,6 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->check_kernel_support = check_kernel_support;
platform_class->process_events = process_events;
-}
+ g_signal_override_class_handler (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_TYPE_PLATFORM, G_CALLBACK (link_changed_cb));
+}