diff mbox series

[net] net: sched: don't use tc_action->order during action dump

Message ID 20190523063231.11581-1-vladbu@mellanox.com
State Accepted
Delegated to: David Miller
Headers show
Series [net] net: sched: don't use tc_action->order during action dump | expand

Commit Message

Vlad Buslov May 23, 2019, 6:32 a.m. UTC
Function tcf_action_dump() relies on tc_action->order field when starting
nested nla to send action data to userspace. This approach breaks in
several cases:

- When multiple filters point to same shared action, tc_action->order field
  is overwritten each time it is attached to filter. This causes filter
  dump to output action with incorrect attribute for all filters that have
  the action in different position (different order) from the last set
  tc_action->order value.

- When action data is displayed using tc action API (RTM_GETACTION), action
  order is overwritten by tca_action_gd() according to its position in
  resulting array of nl attributes, which will break filter dump for all
  filters attached to that shared action that expect it to have different
  order value.

Don't rely on tc_action->order when dumping actions. Set nla according to
action position in resulting array of actions instead.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
---
 net/sched/act_api.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

David Miller May 24, 2019, 8:28 p.m. UTC | #1
From: Vlad Buslov <vladbu@mellanox.com>
Date: Thu, 23 May 2019 09:32:31 +0300

> Function tcf_action_dump() relies on tc_action->order field when starting
> nested nla to send action data to userspace. This approach breaks in
> several cases:
> 
> - When multiple filters point to same shared action, tc_action->order field
>   is overwritten each time it is attached to filter. This causes filter
>   dump to output action with incorrect attribute for all filters that have
>   the action in different position (different order) from the last set
>   tc_action->order value.
> 
> - When action data is displayed using tc action API (RTM_GETACTION), action
>   order is overwritten by tca_action_gd() according to its position in
>   resulting array of nl attributes, which will break filter dump for all
>   filters attached to that shared action that expect it to have different
>   order value.
> 
> Don't rely on tc_action->order when dumping actions. Set nla according to
> action position in resulting array of actions instead.
> 
> Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>

Applied and queued up for -stable.
diff mbox series

Patch

diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 683fcc00da49..c42ecf4b3c10 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -800,7 +800,7 @@  int tcf_action_dump(struct sk_buff *skb, struct tc_action *actions[],
 
 	for (i = 0; i < TCA_ACT_MAX_PRIO && actions[i]; i++) {
 		a = actions[i];
-		nest = nla_nest_start_noflag(skb, a->order);
+		nest = nla_nest_start_noflag(skb, i + 1);
 		if (nest == NULL)
 			goto nla_put_failure;
 		err = tcf_action_dump_1(skb, a, bind, ref);
@@ -1303,7 +1303,6 @@  tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
 			ret = PTR_ERR(act);
 			goto err;
 		}
-		act->order = i;
 		attr_size += tcf_action_fill_size(act);
 		actions[i - 1] = act;
 	}