diff options
author | Johannes Berg <johannes.berg@intel.com> | 2019-05-28 11:56:03 +0300 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2019-06-14 15:12:01 +0300 |
commit | 901bb9891855164fdcfcfdd9c3d25bcc800d3f5b (patch) | |
tree | 74e0821a522ebb1f5bee4cb8df8705dd1a4442f3 /net/wireless/core.c | |
parent | d7edf40c15e85b44c4bef146819b664089b827b1 (diff) | |
download | linux-901bb9891855164fdcfcfdd9c3d25bcc800d3f5b.tar.xz |
nl80211: require and validate vendor command policy
Require that each vendor command give a policy of its sub-attributes
in NL80211_ATTR_VENDOR_DATA, and then (stricly) check the contents,
including the NLA_F_NESTED flag that we couldn't check on the outer
layer because there we don't know yet.
It is possible to use VENDOR_CMD_RAW_DATA for raw data, but then no
nested data can be given (NLA_F_NESTED flag must be clear) and the
data is just passed as is to the command.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/core.c')
-rw-r--r-- | net/wireless/core.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c index 037816163e70..fba0915fbd6f 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -859,6 +859,19 @@ int wiphy_register(struct wiphy *wiphy) return -EINVAL; } + for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { + /* + * Validate we have a policy (can be explicitly set to + * VENDOR_CMD_RAW_DATA which is non-NULL) and also that + * we have at least one of doit/dumpit. + */ + if (WARN_ON(!rdev->wiphy.vendor_commands[i].policy)) + return -EINVAL; + if (WARN_ON(!rdev->wiphy.vendor_commands[i].doit && + !rdev->wiphy.vendor_commands[i].dumpit)) + return -EINVAL; + } + #ifdef CONFIG_PM if (WARN_ON(rdev->wiphy.wowlan && rdev->wiphy.wowlan->n_patterns && (!rdev->wiphy.wowlan->pattern_min_len || |