[NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
        [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
        [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
-       [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, },
+
+       /* need to include at least Auth Transaction and Status Code */
+       [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4),
+
        [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN),
        [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
        [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127),
        [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
                                  .len = IEEE80211_MAX_DATA_LEN },
        [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 },
-       [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = { .type = NLA_U16 },
+       [NL80211_ATTR_MAX_CRIT_PROT_DURATION] =
+               NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION),
        [NL80211_ATTR_PEER_AID] =
                NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
        [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
        [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
        [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY },
        [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY },
-       [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
+       [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2),
        [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
        [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
        [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
                                        .len = FILS_ERP_MAX_RRK_LEN },
        [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2),
        [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
+       [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN),
        [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
        [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
 
                .type = NLA_BINARY,
                .len = NL80211_KCK_EXT_LEN
        },
-       [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN_WARN(NL80211_REPLAY_CTR_LEN),
+       [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN),
        [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 },
 };
 
 /* policy for NAN function attributes */
 static const struct nla_policy
 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
-       [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 },
+       [NL80211_NAN_FUNC_TYPE] =
+               NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE),
        [NL80211_NAN_FUNC_SERVICE_ID] = {
                                    .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
        [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
                params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
                params.ssid_len =
                        nla_len(info->attrs[NL80211_ATTR_SSID]);
-               if (params.ssid_len == 0 ||
-                   params.ssid_len > IEEE80211_MAX_SSID_LEN)
+               if (params.ssid_len == 0)
                        return -EINVAL;
        }
 
                     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
                /*
                 * Need to include at least one (first channel, number of
-                * channels) tuple for each subband, and must have proper
-                * tuples for the rest of the data as well.
+                * channels) tuple for each subband (checked in policy),
+                * and must have proper tuples for the rest of the data as well.
                 */
-               if (params->supported_channels_len < 2)
-                       return -EINVAL;
                if (params->supported_channels_len % 2)
                        return -EINVAL;
        }
                        }
 
                        if (ssid) {
-                               if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
-                                       err = -EINVAL;
-                                       goto out_free;
-                               }
                                memcpy(request->match_sets[i].ssid.ssid,
                                       nla_data(ssid), nla_len(ssid));
                                request->match_sets[i].ssid.ssid_len =
                                        nla_len(ssid);
                        }
-                       if (bssid) {
-                               if (nla_len(bssid) != ETH_ALEN) {
-                                       err = -EINVAL;
-                                       goto out_free;
-                               }
+                       if (bssid)
                                memcpy(request->match_sets[i].bssid,
                                       nla_data(bssid), ETH_ALEN);
-                       }
 
                        /* special attribute - old implementation w/a */
                        request->match_sets[i].rssi_thold = default_match_rssi;
                        return -EINVAL;
                auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
                auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
-               /* need to include at least Auth Transaction and Status Code */
-               if (auth_data_len < 4)
-                       return -EINVAL;
        }
 
        local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
        if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
            !tb[NL80211_REKEY_DATA_KCK])
                return -EINVAL;
-       if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
-               return -ERANGE;
        if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN &&
            !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
              nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN))
 
        func->cookie = cfg80211_assign_cookie(rdev);
 
-       if (!tb[NL80211_NAN_FUNC_TYPE] ||
-           nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) {
+       if (!tb[NL80211_NAN_FUNC_TYPE]) {
                err = -EINVAL;
                goto out;
        }
        duration =
                nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
 
-       if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
-               return -ERANGE;
-
        ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
        if (!ret)
                rdev->crit_proto_nlportid = info->snd_portid;
                goto out;
        }
 
-       if (info->attrs[NL80211_ATTR_PMKR0_NAME]) {
-               int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]);
-
-               if (r0_name_len != WLAN_PMK_NAME_LEN) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
+       if (info->attrs[NL80211_ATTR_PMKR0_NAME])
                pmk_conf.pmk_r0_name =
                        nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
-       }
 
        ret = rdev_set_pmk(rdev, dev, &pmk_conf);
 out:
 
        if (info->attrs[NL80211_ATTR_SSID]) {
                params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
-               if (params.ssid.ssid_len == 0 ||
-                   params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN)
+               if (params.ssid.ssid_len == 0)
                        return -EINVAL;
                memcpy(params.ssid.ssid,
                       nla_data(info->attrs[NL80211_ATTR_SSID]),