From a7a206b8e2324c75c006a2cf57e57201cfaab815 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 6 Jul 2016 17:59:08 +0200 Subject: [PATCH] platform: wifi: drop old wifi data when an interface is renamed Drop the old wifi data when the interface is renamed, otherwise WEXT methods would use the old name. https://bugzilla.gnome.org/show_bug.cgi?id=768433 (cherry picked from commit 45484af2afd33cf1b0846c8e6f81f055e64568fd) --- src/platform/nm-linux-platform.c | 23 ++++++++++++++++++++--- src/platform/wifi/wifi-utils.c | 16 ++++++++++++++++ src/platform/wifi/wifi-utils.h | 4 ++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 1f4e36f730..f6f7be8004 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -5154,13 +5154,30 @@ static WifiData * wifi_get_wifi_data (NMPlatform *platform, int ifindex) { NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); + const NMPlatformLink *pllink; WifiData *wifi_data; wifi_data = g_hash_table_lookup (priv->wifi_data, GINT_TO_POINTER (ifindex)); - if (!wifi_data) { - const NMPlatformLink *pllink; + pllink = nm_platform_link_get (platform, ifindex); - pllink = nm_platform_link_get (platform, ifindex); + /* @wifi_data contains an interface name which is used for WEXT queries. If + * the interface name changes we should at least replace the name in the + * existing structure; but probably a complete reinitialization is better + * because during the initial creation there can be race conditions while + * the interface is renamed by udev. + */ + if (wifi_data && pllink) { + if (!nm_streq (wifi_utils_get_iface (wifi_data), pllink->name)) { + _LOGD ("wifi: interface %s renamed to %s, dropping old data for ifindex %d", + wifi_utils_get_iface (wifi_data), + pllink->name, + ifindex); + g_hash_table_remove (priv->wifi_data, GINT_TO_POINTER (ifindex)); + wifi_data = NULL; + } + } + + if (!wifi_data) { if (pllink) { if (pllink->type == NM_LINK_TYPE_WIFI) wifi_data = wifi_utils_init (pllink->name, ifindex, TRUE); diff --git a/src/platform/wifi/wifi-utils.c b/src/platform/wifi/wifi-utils.c index 38e5a0545e..4f04041a2d 100644 --- a/src/platform/wifi/wifi-utils.c +++ b/src/platform/wifi/wifi-utils.c @@ -70,6 +70,22 @@ wifi_utils_init (const char *iface, int ifindex, gboolean check_scan) return ret; } +int +wifi_utils_get_ifindex (WifiData *data) +{ + g_return_val_if_fail (data != NULL, -1); + + return data->ifindex; +} + +const char * +wifi_utils_get_iface (WifiData *data) +{ + g_return_val_if_fail (data != NULL, NULL); + + return data->iface; +} + NMDeviceWifiCapabilities wifi_utils_get_caps (WifiData *data) { diff --git a/src/platform/wifi/wifi-utils.h b/src/platform/wifi/wifi-utils.h index 21dac9e9cc..9555bbeece 100644 --- a/src/platform/wifi/wifi-utils.h +++ b/src/platform/wifi/wifi-utils.h @@ -33,6 +33,10 @@ gboolean wifi_utils_is_wifi (const char *iface, const char *sysfs_path); WifiData *wifi_utils_init (const char *iface, int ifindex, gboolean check_scan); +int wifi_utils_get_ifindex (WifiData *data); + +const char *wifi_utils_get_iface (WifiData *data); + void wifi_utils_deinit (WifiData *data); NMDeviceWifiCapabilities wifi_utils_get_caps (WifiData *data);