Add commit 5e47596bee12597824a3b5b21e20f80b61e58a35 to kernel fixes.
This will fix https://bugs.openfabrics.org/show_bug.cgi?id=1664.

Signed-off-by: Moni Shoua <[email protected]>
---
 kernel_patches/fixes/ipoib_0550_check_multicast_address_format.patch |   51 
++++++++++
 1 file changed, 51 insertions(+)

diff --git 
a/kernel_patches/fixes/ipoib_0550_check_multicast_address_format.patch 
b/kernel_patches/fixes/ipoib_0550_check_multicast_address_format.patch
new file mode 100644
index 0000000..a98e591
--- /dev/null
+++ b/kernel_patches/fixes/ipoib_0550_check_multicast_address_format.patch
@@ -0,0 +1,51 @@
+commit 5e47596bee12597824a3b5b21e20f80b61e58a35
+Author: Jason Gunthorpe <[email protected]>
+Date:   Sat Sep 5 20:23:40 2009 -0700
+
+    IPoIB: Check multicast address format
+    
+    Check that the format of multicast link addresses is correct before
+    taking them from dev->mc_list to priv->multicast_list.  This way we
+    never try to send a bogus address to the SA, which prevents badness
+    from erronous 'ip maddr addr add', broken bonding drivers, etc.
+    
+    Signed-off-by: Jason Gunthorpe <[email protected]>
+    Signed-off-by: Roland Dreier <[email protected]>
+
+diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 
b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+index a0825fe..25874fc 100644
+--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+@@ -760,6 +760,20 @@ void ipoib_mcast_dev_flush(struct net_device *dev)
+       }
+ }
+ 
++static int ipoib_mcast_addr_is_valid(const u8 *addr, unsigned int addrlen,
++                                   const u8 *broadcast)
++{
++      if (addrlen != INFINIBAND_ALEN)
++              return 0;
++      /* reserved QPN, prefix, scope */
++      if (memcmp(addr, broadcast, 6))
++              return 0;
++      /* signature lower, pkey */
++      if (memcmp(addr + 7, broadcast + 7, 3))
++              return 0;
++      return 1;
++}
++
+ void ipoib_mcast_restart_task(struct work_struct *work)
+ {
+       struct ipoib_dev_priv *priv =
+@@ -793,6 +807,11 @@ void ipoib_mcast_restart_task(struct work_struct *work)
+       for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
+               union ib_gid mgid;
+ 
++              if (!ipoib_mcast_addr_is_valid(mclist->dmi_addr,
++                                             mclist->dmi_addrlen,
++                                             dev->broadcast))
++                      continue;
++
+               memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid);
+ 
+               mcast = __ipoib_mcast_find(dev, &mgid);
_______________________________________________
ewg mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to