The 'parse_action_control()' helper advances the argument pointers to past its parsed action already, so don't advance it further in 'act_parse_polic()'.
Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions") Signed-off-by: Wolfgang Bumiller <w.bumil...@proxmox.com> --- Basically parse_action_control() silently added a NEXT_ARG() while the cases before didn't have one. Not sure whether the goto is okay style-wise, let me know if you prefer some other solution. Example for triggering this: Specifying a 'flowid X' after a `police ... drop` will skip the 'flowid' and error with "What is X" $ tc filter add dev eth0 parent ffff: basic police rate 13371337bps burst 1337b mtu 64kb drop flowid :1 What is ":1"? ... tc/m_police.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tc/m_police.c b/tc/m_police.c index ff1dcb7d..f0878b3a 100644 --- a/tc/m_police.c +++ b/tc/m_police.c @@ -154,6 +154,7 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, matches(*argv, "goto") == 0) { if (parse_action_control(&argc, &argv, &p.action, false)) return -1; + goto keep_arg; } else if (strcmp(*argv, "conform-exceed") == 0) { NEXT_ARG(); if (parse_action_control_slash(&argc, &argv, &p.action, @@ -174,8 +175,9 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, } else { break; } - ok++; argc--; argv++; +keep_arg: + ok++; } if (!ok) -- 2.11.0