Commit 45fcef8b authored by Johannes Berg's avatar Johannes Berg

mac80211_hwsim: calculate if_combination.max_interfaces

If we just set this to 2048, and have multiple limits you
can select from, the total number might run over and cause
a warning in cfg80211. This doesn't make sense, so we just
calculate the total max_interfaces now.

Reported-by: syzbot+8f91bd563bbff230d0ee@syzkaller.appspotmail.com
Fixes: 99e3a44b ("mac80211_hwsim: allow setting iftype support")
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent a58d7525
...@@ -2644,7 +2644,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info, ...@@ -2644,7 +2644,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
enum nl80211_band band; enum nl80211_band band;
const struct ieee80211_ops *ops = &mac80211_hwsim_ops; const struct ieee80211_ops *ops = &mac80211_hwsim_ops;
struct net *net; struct net *net;
int idx; int idx, i;
int n_limits = 0; int n_limits = 0;
if (WARN_ON(param->channels > 1 && !param->use_chanctx)) if (WARN_ON(param->channels > 1 && !param->use_chanctx))
...@@ -2768,12 +2768,23 @@ static int mac80211_hwsim_new_radio(struct genl_info *info, ...@@ -2768,12 +2768,23 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
goto failed_hw; goto failed_hw;
} }
data->if_combination.max_interfaces = 0;
for (i = 0; i < n_limits; i++)
data->if_combination.max_interfaces +=
data->if_limits[i].max;
data->if_combination.n_limits = n_limits; data->if_combination.n_limits = n_limits;
data->if_combination.max_interfaces = 2048;
data->if_combination.limits = data->if_limits; data->if_combination.limits = data->if_limits;
/*
* If we actually were asked to support combinations,
* advertise them - if there's only a single thing like
* only IBSS then don't advertise it as combinations.
*/
if (data->if_combination.max_interfaces > 1) {
hw->wiphy->iface_combinations = &data->if_combination; hw->wiphy->iface_combinations = &data->if_combination;
hw->wiphy->n_iface_combinations = 1; hw->wiphy->n_iface_combinations = 1;
}
if (param->ciphers) { if (param->ciphers) {
memcpy(data->ciphers, param->ciphers, memcpy(data->ciphers, param->ciphers,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment