forked from mirrors/linux
		
	net_sched: add policy validation for action attributes
Similar to commit 8b4c3cdd9d
("net: sched: Add policy validation for tc attributes"), we need
to add proper policy validation for TC action attributes too.
Cc: David Ahern <dsahern@gmail.com>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
			
			
This commit is contained in:
		
							parent
							
								
									62794fc4fb
								
							
						
					
					
						commit
						199ce850ce
					
				
					 1 changed files with 18 additions and 16 deletions
				
			
		|  | @ -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; | ||||
| 		} | ||||
| 		nla_strlcpy(act_name, kind, IFNAMSIZ); | ||||
| 
 | ||||
| 		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; | ||||
| 			} | ||||
| 
 | ||||
| 			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]; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Cong Wang
						Cong Wang