diff options
Diffstat (limited to 'net/sched/act_api.c')
| -rw-r--r-- | net/sched/act_api.c | 34 | 
1 files changed, 18 insertions, 16 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 339712296164..2558f00f6b3e 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -831,6 +831,15 @@ static struct tc_cookie *nla_memdup_cookie(struct nlattr **tb)  	return c;  } +static const struct nla_policy tcf_action_policy[TCA_ACT_MAX + 1] = { +	[TCA_ACT_KIND]		= { .type = NLA_NUL_STRING, +				    .len = IFNAMSIZ - 1 }, +	[TCA_ACT_INDEX]		= { .type = NLA_U32 }, +	[TCA_ACT_COOKIE]	= { .type = NLA_BINARY, +				    .len = TC_COOKIE_MAX_SIZE }, +	[TCA_ACT_OPTIONS]	= { .type = NLA_NESTED }, +}; +  struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,  				    struct nlattr *nla, struct nlattr *est,  				    char *name, int ovr, int bind, @@ -846,8 +855,8 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,  	int err;  	if (name == NULL) { -		err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, -						  extack); +		err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, +						  tcf_action_policy, extack);  		if (err < 0)  			goto err_out;  		err = -EINVAL; @@ -856,18 +865,9 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,  			NL_SET_ERR_MSG(extack, "TC action kind must be specified");  			goto err_out;  		} -		if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ) { -			NL_SET_ERR_MSG(extack, "TC action name too long"); -			goto err_out; -		} -		if (tb[TCA_ACT_COOKIE]) { -			int cklen = nla_len(tb[TCA_ACT_COOKIE]); - -			if (cklen > TC_COOKIE_MAX_SIZE) { -				NL_SET_ERR_MSG(extack, "TC cookie size above the maximum"); -				goto err_out; -			} +		nla_strlcpy(act_name, kind, IFNAMSIZ); +		if (tb[TCA_ACT_COOKIE]) {  			cookie = nla_memdup_cookie(tb);  			if (!cookie) {  				NL_SET_ERR_MSG(extack, "No memory to generate TC cookie"); @@ -1098,7 +1098,8 @@ static struct tc_action *tcf_action_get_1(struct net *net, struct nlattr *nla,  	int index;  	int err; -	err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, extack); +	err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, +					  tcf_action_policy, extack);  	if (err < 0)  		goto err_out; @@ -1152,7 +1153,8 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,  	b = skb_tail_pointer(skb); -	err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, extack); +	err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, +					  tcf_action_policy, extack);  	if (err < 0)  		goto err_out; @@ -1440,7 +1442,7 @@ static struct nlattr *find_dump_kind(struct nlattr **nla)  	if (tb[1] == NULL)  		return NULL; -	if (nla_parse_nested_deprecated(tb2, TCA_ACT_MAX, tb[1], NULL, NULL) < 0) +	if (nla_parse_nested_deprecated(tb2, TCA_ACT_MAX, tb[1], tcf_action_policy, NULL) < 0)  		return NULL;  	kind = tb2[TCA_ACT_KIND];  |