discover/network: Ignore interfaces with pre-existing MAC address
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>
Thu, 12 Jan 2017 00:12:42 +0000 (11:12 +1100)
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>
Tue, 31 Jan 2017 00:59:26 +0000 (11:59 +1100)
Petitboot uses the MAC address of network interfaces as a unique
identifier. This can cause a crash in pb-discover on a machine that has
multiple interfaces with the same MAC address.
While duplicate MAC addresses are rare and imply an issue with the
larger system configuration Petitboot should handle this gracefully, so
log a warning and ignore any interfaces other than the first to appear
that share a MAC address.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
discover/network.c

index 6ae44175ab134dd408f52060b20773b7e6884fbf..8ca4561614f866fc1c45ef77f44ffc03c8c7fd85 100644 (file)
@@ -497,7 +497,7 @@ static void configure_interface(struct network *network,
 static int network_handle_nlmsg(struct network *network, struct nlmsghdr *nlmsg)
 {
        bool have_ifaddr, have_ifname;
 static int network_handle_nlmsg(struct network *network, struct nlmsghdr *nlmsg)
 {
        bool have_ifaddr, have_ifname;
-       struct interface *interface;
+       struct interface *interface, *tmp;
        struct ifinfomsg *info;
        struct rtattr *attr;
        unsigned int mtu;
        struct ifinfomsg *info;
        struct rtattr *attr;
        unsigned int mtu;
@@ -562,6 +562,16 @@ static int network_handle_nlmsg(struct network *network, struct nlmsghdr *nlmsg)
                interface->state = IFSTATE_NEW;
                memcpy(interface->hwaddr, ifaddr, sizeof(interface->hwaddr));
                strncpy(interface->name, ifname, sizeof(interface->name) - 1);
                interface->state = IFSTATE_NEW;
                memcpy(interface->hwaddr, ifaddr, sizeof(interface->hwaddr));
                strncpy(interface->name, ifname, sizeof(interface->name) - 1);
+
+               list_for_each_entry(&network->interfaces, tmp, list)
+                       if (memcmp(interface->hwaddr, tmp->hwaddr,
+                                  sizeof(interface->hwaddr)) == 0) {
+                               pb_log("%s: %s has duplicate MAC address, ignoring\n",
+                                      __func__, interface->name);
+                               talloc_free(interface);
+                               return -1;
+                       }
+
                list_add(&network->interfaces, &interface->list);
                create_interface_dev(network, interface);
        }
                list_add(&network->interfaces, &interface->list);
                create_interface_dev(network, interface);
        }