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

Reply via email to