diff options
Diffstat (limited to 'net/sched/act_api.c')
| -rw-r--r-- | net/sched/act_api.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 2558f00f6b3e..69d4676a402f 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -832,8 +832,7 @@ static struct tc_cookie *nla_memdup_cookie(struct nlattr **tb)  }  static const struct nla_policy tcf_action_policy[TCA_ACT_MAX + 1] = { -	[TCA_ACT_KIND]		= { .type = NLA_NUL_STRING, -				    .len = IFNAMSIZ - 1 }, +	[TCA_ACT_KIND]		= { .type = NLA_STRING },  	[TCA_ACT_INDEX]		= { .type = NLA_U32 },  	[TCA_ACT_COOKIE]	= { .type = NLA_BINARY,  				    .len = TC_COOKIE_MAX_SIZE }, @@ -865,8 +864,10 @@ 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;  		} -		nla_strlcpy(act_name, kind, IFNAMSIZ); - +		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]) {  			cookie = nla_memdup_cookie(tb);  			if (!cookie) { @@ -1352,11 +1353,16 @@ static int tcf_action_add(struct net *net, struct nlattr *nla,  			  struct netlink_ext_ack *extack)  {  	size_t attr_size = 0; -	int ret = 0; +	int loop, ret;  	struct tc_action *actions[TCA_ACT_MAX_PRIO] = {}; -	ret = tcf_action_init(net, NULL, nla, NULL, NULL, ovr, 0, actions, -			      &attr_size, true, extack); +	for (loop = 0; loop < 10; loop++) { +		ret = tcf_action_init(net, NULL, nla, NULL, NULL, ovr, 0, +				      actions, &attr_size, true, extack); +		if (ret != -EAGAIN) +			break; +	} +  	if (ret < 0)  		return ret;  	ret = tcf_add_notify(net, n, actions, portid, attr_size, extack); @@ -1406,11 +1412,8 @@ static int tc_ctl_action(struct sk_buff *skb, struct nlmsghdr *n,  		 */  		if (n->nlmsg_flags & NLM_F_REPLACE)  			ovr = 1; -replay:  		ret = tcf_action_add(net, tca[TCA_ACT_TAB], n, portid, ovr,  				     extack); -		if (ret == -EAGAIN) -			goto replay;  		break;  	case RTM_DELACTION:  		ret = tca_action_gd(net, tca[TCA_ACT_TAB], n,  | 
