cfg80211: reject invalid configuration items
Reject configuring mesh-id for non-mesh, monitor flags for non-monitor. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
f8b25cdad7
commit
92ffe055c3
@ -418,7 +418,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
|
|||||||
int err, ifindex;
|
int err, ifindex;
|
||||||
enum nl80211_iftype type;
|
enum nl80211_iftype type;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
u32 flags;
|
u32 _flags, *flags = NULL;
|
||||||
|
|
||||||
memset(¶ms, 0, sizeof(params));
|
memset(¶ms, 0, sizeof(params));
|
||||||
|
|
||||||
@ -442,18 +442,28 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == NL80211_IFTYPE_MESH_POINT &&
|
if (info->attrs[NL80211_ATTR_MESH_ID]) {
|
||||||
info->attrs[NL80211_ATTR_MESH_ID]) {
|
if (type != NL80211_IFTYPE_MESH_POINT) {
|
||||||
|
err = -EINVAL;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
|
params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
|
||||||
params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
|
params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
|
||||||
|
if (type != NL80211_IFTYPE_MONITOR) {
|
||||||
|
err = -EINVAL;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
|
||||||
|
&_flags);
|
||||||
|
if (!err)
|
||||||
|
flags = &_flags;
|
||||||
|
}
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
|
|
||||||
info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
|
|
||||||
&flags);
|
|
||||||
err = drv->ops->change_virtual_intf(&drv->wiphy, ifindex,
|
err = drv->ops->change_virtual_intf(&drv->wiphy, ifindex,
|
||||||
type, err ? NULL : &flags, ¶ms);
|
type, flags, ¶ms);
|
||||||
|
|
||||||
dev = __dev_get_by_index(&init_net, ifindex);
|
dev = __dev_get_by_index(&init_net, ifindex);
|
||||||
WARN_ON(!dev || (!err && dev->ieee80211_ptr->iftype != type));
|
WARN_ON(!dev || (!err && dev->ieee80211_ptr->iftype != type));
|
||||||
|
Loading…
Reference in New Issue
Block a user