summaryrefslogtreecommitdiffstats
path: root/discover/network.c
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-01-12 11:12:42 +1100
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-01-31 11:59:26 +1100
commit58b86dca9e65824e8fd25df58794a88ac31ab01f (patch)
tree2b55264b14a857ed10ffde4a560e477c8b581021 /discover/network.c
parent0e2792afaf5a2d576ed12b965468069819057c07 (diff)
downloadtalos-petitboot-58b86dca9e65824e8fd25df58794a88ac31ab01f.tar.gz
talos-petitboot-58b86dca9e65824e8fd25df58794a88ac31ab01f.zip
discover/network: Ignore interfaces with pre-existing MAC address
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>
Diffstat (limited to 'discover/network.c')
-rw-r--r--discover/network.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/discover/network.c b/discover/network.c
index 6ae4417..8ca4561 100644
--- a/discover/network.c
+++ b/discover/network.c
@@ -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;
- struct interface *interface;
+ struct interface *interface, *tmp;
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);
+
+ 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);
}
OpenPOWER on IntegriCloud