mwifiex: fix memory corruption when unsetting multicast list
When trying to unset a previously-set multicast list (i.e. the new list has 0 entries), mwifiex_set_multicast_list() was calling down to mwifiex_request_set_multicast_list() while leaving mcast_list.num_multicast_addr as an uninitialized value. We were arriving at mwifiex_cmd_mac_multicast_adr() which would then proceed to do an often huge memcpy of mcast_list.num_multicast_addr*ETH_ALEN bytes, causing memory corruption and hard to debug crashes. Fix this by setting mcast_list.num_multicast_addr to 0 when no multicast list is provided. Similarly, fix up the logic in mwifiex_request_set_multicast_list() to unset the multicast list that was previously sent to the hardware in such cases. Signed-off-by: Daniel Drake <dsd@laptop.org> Acked-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
3c68ef5b22
commit
6390d88529
@@ -669,9 +669,8 @@ static void mwifiex_set_multicast_list(struct net_device *dev)
|
||||
mcast_list.mode = MWIFIEX_ALL_MULTI_MODE;
|
||||
} else {
|
||||
mcast_list.mode = MWIFIEX_MULTICAST_MODE;
|
||||
if (netdev_mc_count(dev))
|
||||
mcast_list.num_multicast_addr =
|
||||
mwifiex_copy_mcast_addr(&mcast_list, dev);
|
||||
mcast_list.num_multicast_addr =
|
||||
mwifiex_copy_mcast_addr(&mcast_list, dev);
|
||||
}
|
||||
mwifiex_request_set_multicast_list(priv, &mcast_list);
|
||||
}
|
||||
|
Reference in New Issue
Block a user