On Fri, Apr 26, 2019 at 02:13:46PM +0200, Johannes Berg wrote:
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index 4fc7c122e916..09a17b30ba73 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -219,6 +219,8 @@ static int validate_ie_attr(const struct nlattr *attr,
> }
>
> /* policy for the attributes */
> +static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR];
> +
> static const struct nla_policy
> nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = {
> [0] = { .strict_start_type = NL80211_FTM_RESP_ATTR_CIVICLOC + 1 },
> @@ -268,11 +270,7 @@ static const struct nla_policy
> nl80211_psmr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = {
> [0] = { .strict_start_type = NL80211_PMSR_PEER_ATTR_RESP + 1 },
> [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR,
> - /*
> - * we could specify this again to be the top-level policy,
> - * but that would open us up to recursion problems ...
> - */
> - [NL80211_PMSR_PEER_ATTR_CHAN] = { .type = NLA_NESTED },
> + [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy),
I guess you only allow one more nested instance of this attribute?
I mean, how many times is NL80211 allow to recurse on this?
Probably you can define a new nl80211_policy_recurse object and set a
flag somewhere to describe that no more recursion are permitted?
I would try to handle this from nl80211, instead of from the core by
limiting recursions to 10.
Once we expose the descriptions to userspace, I would expect we'll end
with tools to validate all kind of stuff like this, eg. fuzzy tested,
check for recursions like this (which IMO they should not be allowed).