Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e47596b authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Roland Dreier
Browse files

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: default avatarJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 721d67cd
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -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);