Merge tag 'x86-urgent-2020-09-06' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / net / macvlan.c
index 4942f61..c8d803d 100644 (file)
@@ -842,7 +842,7 @@ static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        case SIOCSHWTSTAMP:
                if (!net_eq(dev_net(dev), &init_net))
                        break;
-               /* fall through */
+               fallthrough;
        case SIOCGHWTSTAMP:
                if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
                        err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
@@ -1269,6 +1269,9 @@ static void macvlan_port_destroy(struct net_device *dev)
 static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[],
                            struct netlink_ext_ack *extack)
 {
+       struct nlattr *nla, *head;
+       int rem, len;
+
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
                        return -EINVAL;
@@ -1316,6 +1319,20 @@ static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[],
                        return -EADDRNOTAVAIL;
        }
 
+       if (data[IFLA_MACVLAN_MACADDR_DATA]) {
+               head = nla_data(data[IFLA_MACVLAN_MACADDR_DATA]);
+               len = nla_len(data[IFLA_MACVLAN_MACADDR_DATA]);
+
+               nla_for_each_attr(nla, head, len, rem) {
+                       if (nla_type(nla) != IFLA_MACVLAN_MACADDR ||
+                           nla_len(nla) != ETH_ALEN)
+                               return -EINVAL;
+
+                       if (!is_valid_ether_addr(nla_data(nla)))
+                               return -EADDRNOTAVAIL;
+               }
+       }
+
        if (data[IFLA_MACVLAN_MACADDR_COUNT])
                return -EINVAL;
 
@@ -1372,10 +1389,6 @@ static int macvlan_changelink_sources(struct macvlan_dev *vlan, u32 mode,
                len = nla_len(data[IFLA_MACVLAN_MACADDR_DATA]);
 
                nla_for_each_attr(nla, head, len, rem) {
-                       if (nla_type(nla) != IFLA_MACVLAN_MACADDR ||
-                           nla_len(nla) != ETH_ALEN)
-                               continue;
-
                        addr = nla_data(nla);
                        ret = macvlan_hash_add_source(vlan, addr);
                        if (ret)