diff mbox

infiniband: make sure the src net is infiniband when create new link

Message ID 1388655458-25269-1-git-send-email-liuhangbin@gmail.com
State Superseded, archived
Delegated to: David Miller
Headers show

Commit Message

Hangbin Liu Jan. 2, 2014, 9:37 a.m. UTC
When we create a new infiniband link with uninfiniband device, e.g. `ip link
add link em1 type ipoib pkey 0x8001`. We will get a NULL pointer dereference
cause other dev like Ethernet don't have struct ib_device.

The code path is:
rtnl_newlink
  |-- ipoib_new_child_link
        |-- __ipoib_vlan_add
              |-- ipoib_set_dev_features
	            |-- ib_query_device

Fix this bug by make sure the src net is infiniband when create new link.

Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
---
 drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 3 +++
 1 file changed, 3 insertions(+)
diff mbox

Patch

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
index c29b5c8..de340c9 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
@@ -31,6 +31,7 @@ 
  */
 
 #include <linux/netdevice.h>
+#include <linux/if_arp.h>	/* For ARPHRD_xxx */
 #include <linux/module.h>
 #include <net/rtnetlink.h>
 #include "ipoib.h"
@@ -105,6 +106,8 @@  static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
 	pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
 	if (!pdev)
 		return -ENODEV;
+	if (pdev->type != ARPHRD_INFINIBAND)
+		return -ENODEV;
 
 	ppriv = netdev_priv(pdev);