Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Johannes Berg and committed by
John W. Linville
92ffe055 f8b25cda

+17 -7
+17 -7
net/wireless/nl80211.c
··· 418 418 int err, ifindex; 419 419 enum nl80211_iftype type; 420 420 struct net_device *dev; 421 - u32 flags; 421 + u32 _flags, *flags = NULL; 422 422 423 423 memset(&params, 0, sizeof(params)); 424 424 ··· 442 442 goto unlock; 443 443 } 444 444 445 - if (type == NL80211_IFTYPE_MESH_POINT && 446 - info->attrs[NL80211_ATTR_MESH_ID]) { 445 + if (info->attrs[NL80211_ATTR_MESH_ID]) { 446 + if (type != NL80211_IFTYPE_MESH_POINT) { 447 + err = -EINVAL; 448 + goto unlock; 449 + } 447 450 params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 448 451 params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 449 452 } 450 453 454 + if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 455 + if (type != NL80211_IFTYPE_MONITOR) { 456 + err = -EINVAL; 457 + goto unlock; 458 + } 459 + err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 460 + &_flags); 461 + if (!err) 462 + flags = &_flags; 463 + } 451 464 rtnl_lock(); 452 - err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ? 453 - info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, 454 - &flags); 455 465 err = drv->ops->change_virtual_intf(&drv->wiphy, ifindex, 456 - type, err ? NULL : &flags, &params); 466 + type, flags, &params); 457 467 458 468 dev = __dev_get_by_index(&init_net, ifindex); 459 469 WARN_ON(!dev || (!err && dev->ieee80211_ptr->iftype != type));