vxlan: fix oops when give unknown ifindex
authorstephen hemminger <shemminger@vyatta.com>
Tue, 9 Oct 2012 20:35:53 +0000 (20:35 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Oct 2012 02:41:22 +0000 (22:41 -0400)
If vxlan is created and the ifindex is passed; there are two cases which
are incorrectly handled by the existing code. The ifindex could be zero
(i.e. no device) or there could be no device with that ifindex.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index 763061d97921d66a08d3b39d6529a48f421e1c76..607976c001626a75afbf590411bf6ec1bbff26c0 100644 (file)
@@ -1090,14 +1090,18 @@ static int vxlan_newlink(struct net *net, struct net_device *dev,
        if (data[IFLA_VXLAN_LOCAL])
                vxlan->saddr = nla_get_be32(data[IFLA_VXLAN_LOCAL]);
 
-       if (data[IFLA_VXLAN_LINK]) {
-               vxlan->link = nla_get_u32(data[IFLA_VXLAN_LINK]);
+       if (data[IFLA_VXLAN_LINK] &&
+           (vxlan->link = nla_get_u32(data[IFLA_VXLAN_LINK]))) {
+               struct net_device *lowerdev
+                        = __dev_get_by_index(net, vxlan->link);
+
+               if (!lowerdev) {
+                       pr_info("ifindex %d does not exist\n", vxlan->link);
+                       return -ENODEV;
+               }
 
-               if (!tb[IFLA_MTU]) {
-                       struct net_device *lowerdev;
-                       lowerdev = __dev_get_by_index(net, vxlan->link);
+               if (!tb[IFLA_MTU])
                        dev->mtu = lowerdev->mtu - VXLAN_HEADROOM;
-               }
        }
 
        if (data[IFLA_VXLAN_TOS])