Use always the interface index and only when interface name
is needed, then fetch the name. This minimizes races when
interface name changes because of udev rules.
---
src/rtnl.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/rtnl.c b/src/rtnl.c
index e2e16d0..f8f1429 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -65,7 +65,6 @@ static guint update_timeout = 0;
struct interface_data {
int index;
- char *name;
char *ident;
enum connman_service_type service_type;
enum connman_device_type device_type;
@@ -81,7 +80,6 @@ static void free_interface(gpointer data)
interface->index, interface->ident);
g_free(interface->ident);
- g_free(interface->name);
g_free(interface);
}
@@ -120,11 +118,13 @@ static bool wext_interface(char *ifname)
static void read_uevent(struct interface_data *interface)
{
- char *filename, line[128];
+ char *filename, *name, line[128];
bool found_devtype;
FILE *f;
- if (ether_blacklisted(interface->name)) {
+ name = connman_inet_ifname(interface->index);
+
+ if (ether_blacklisted(name)) {
interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
interface->device_type = CONNMAN_DEVICE_TYPE_UNKNOWN;
} else {
@@ -132,15 +132,14 @@ static void read_uevent(struct interface_data *interface)
interface->device_type = CONNMAN_DEVICE_TYPE_ETHERNET;
}
- filename = g_strdup_printf("/sys/class/net/%s/uevent",
- interface->name);
+ filename = g_strdup_printf("/sys/class/net/%s/uevent", name);
f = fopen(filename, "re");
g_free(filename);
if (!f)
- return;
+ goto out;
found_devtype = false;
while (fgets(line, sizeof(line), f)) {
@@ -178,16 +177,18 @@ static void read_uevent(struct interface_data *interface)
fclose(f);
if (found_devtype)
- return;
+ goto out;
/* We haven't got a DEVTYPE, let's check if it's a wireless device */
- if (wext_interface(interface->name)) {
+ if (wext_interface(name)) {
interface->service_type = CONNMAN_SERVICE_TYPE_WIFI;
interface->device_type = CONNMAN_DEVICE_TYPE_WIFI;
- connman_error("%s runs an unsupported 802.11 driver",
- interface->name);
+ connman_error("%s runs an unsupported 802.11 driver", name);
}
+
+out:
+ g_free(name);
}
enum connman_device_type __connman_rtnl_get_device_type(int index)
@@ -451,7 +452,6 @@ static void process_newlink(unsigned short type, int index,
unsigned flags,
if (!interface) {
interface = g_new0(struct interface_data, 1);
interface->index = index;
- interface->name = g_strdup(ifname);
interface->ident = g_strdup(ident);
g_hash_table_insert(interface_list,
--
1.7.11.7
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman