naccyde / rpms / iproute

Forked from rpms/iproute 7 months ago
Clone

Blame SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch

36cfb7
From 1a12c7c90330410171007ada7513247fda5a1c57 Mon Sep 17 00:00:00 2001
36cfb7
From: Andrea Claudi <aclaudi@redhat.com>
36cfb7
Date: Wed, 5 Jun 2019 13:11:03 +0200
36cfb7
Subject: [PATCH] tc: util: Don't call NEXT_ARG_FWD() in
36cfb7
 __parse_action_control()
36cfb7
36cfb7
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
36cfb7
Upstream Status: iproute2.git commit 3572e01a090a2
36cfb7
Conflicts: context change mainly due to missing commit 35f2a7639dca4
36cfb7
           ("tc/actions: introduce support for jump action")
36cfb7
36cfb7
commit 3572e01a090a298e2f4c4f796bad6639b652e031
36cfb7
Author: Michal Privoznik <mprivozn@redhat.com>
36cfb7
Date:   Fri Dec 8 11:18:07 2017 +0100
36cfb7
36cfb7
    tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control()
36cfb7
36cfb7
    Not all callers want parse_action_control*() to advance the
36cfb7
    arguments. For instance act_parse_police() does the argument
36cfb7
    advancing itself.
36cfb7
36cfb7
    Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions")
36cfb7
    Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
36cfb7
---
36cfb7
 tc/m_bpf.c        |  1 +
36cfb7
 tc/m_connmark.c   |  1 +
36cfb7
 tc/m_csum.c       |  1 +
36cfb7
 tc/m_gact.c       | 12 ++++++------
36cfb7
 tc/m_ife.c        |  1 +
36cfb7
 tc/m_mirred.c     |  4 +++-
36cfb7
 tc/m_nat.c        |  1 +
36cfb7
 tc/m_pedit.c      |  1 +
36cfb7
 tc/m_sample.c     |  1 +
36cfb7
 tc/m_skbedit.c    |  1 +
36cfb7
 tc/m_skbmod.c     |  1 +
36cfb7
 tc/m_tunnel_key.c |  1 +
36cfb7
 tc/m_vlan.c       |  1 +
36cfb7
 tc/tc_util.c      |  1 -
36cfb7
 14 files changed, 20 insertions(+), 8 deletions(-)
36cfb7
36cfb7
diff --git a/tc/m_bpf.c b/tc/m_bpf.c
36cfb7
index 57283030a35f5..c2bad5640707c 100644
36cfb7
--- a/tc/m_bpf.c
36cfb7
+++ b/tc/m_bpf.c
36cfb7
@@ -125,6 +125,7 @@ opt_bpf:
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &parm.action,
36cfb7
 				  false, TC_ACT_PIPE);
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
diff --git a/tc/m_connmark.c b/tc/m_connmark.c
36cfb7
index 37d7185415490..47c7a8c2b17e7 100644
36cfb7
--- a/tc/m_connmark.c
36cfb7
+++ b/tc/m_connmark.c
36cfb7
@@ -82,6 +82,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
36cfb7
 	}
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE);
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
diff --git a/tc/m_csum.c b/tc/m_csum.c
36cfb7
index 7b156734f64c5..e1352c0820f69 100644
36cfb7
--- a/tc/m_csum.c
36cfb7
+++ b/tc/m_csum.c
36cfb7
@@ -124,6 +124,7 @@ parse_csum(struct action_util *a, int *argc_p,
36cfb7
 	}
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
diff --git a/tc/m_gact.c b/tc/m_gact.c
36cfb7
index 73346d4e9333b..dd9542a5cc644 100644
36cfb7
--- a/tc/m_gact.c
36cfb7
+++ b/tc/m_gact.c
36cfb7
@@ -86,14 +86,13 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 	if (argc < 0)
36cfb7
 		return -1;
36cfb7
 
36cfb7
-
36cfb7
-	if (matches(*argv, "gact") == 0) {
36cfb7
-		argc--;
36cfb7
-		argv++;
36cfb7
-	} else if (parse_action_control(&argc, &argv, &p.action, false) == -1) {
36cfb7
-		usage();
36cfb7
+	if (matches(*argv, "gact") != 0 &&
36cfb7
+		parse_action_control(&argc, &argv, &p.action, false) == -1) {
36cfb7
+		usage();	/* does not return */
36cfb7
 	}
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
+
36cfb7
 #ifdef CONFIG_GACT_PROB
36cfb7
 	if (argc > 0) {
36cfb7
 		if (matches(*argv, "random") == 0) {
36cfb7
@@ -113,6 +112,7 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 			if (parse_action_control(&argc, &argv,
36cfb7
 						 &pp.paction, false) == -1)
36cfb7
 				usage();
36cfb7
+			NEXT_ARG_FWD();
36cfb7
 			if (get_u16(&pp.pval, *argv, 10)) {
36cfb7
 				fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval);
36cfb7
 				return -1;
36cfb7
diff --git a/tc/m_ife.c b/tc/m_ife.c
36cfb7
index e3521e62c178c..54fad8f70e73a 100644
36cfb7
--- a/tc/m_ife.c
36cfb7
+++ b/tc/m_ife.c
36cfb7
@@ -158,6 +158,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_mirred.c b/tc/m_mirred.c
36cfb7
index 2384bda1ff045..b09b016c2ca39 100644
36cfb7
--- a/tc/m_mirred.c
36cfb7
+++ b/tc/m_mirred.c
36cfb7
@@ -170,8 +170,10 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 	}
36cfb7
 
36cfb7
 
36cfb7
-	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
36cfb7
+	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) {
36cfb7
 		parse_action_control(&argc, &argv, &p.action, false);
36cfb7
+		NEXT_ARG_FWD();
36cfb7
+	}
36cfb7
 
36cfb7
 	if (argc) {
36cfb7
 		if (iok && matches(*argv, "index") == 0) {
36cfb7
diff --git a/tc/m_nat.c b/tc/m_nat.c
36cfb7
index 31b68fb6bd784..bb455f080b3a4 100644
36cfb7
--- a/tc/m_nat.c
36cfb7
+++ b/tc/m_nat.c
36cfb7
@@ -117,6 +117,7 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
36cfb7
index 5d89ab1d832ab..3391be95da38c 100644
36cfb7
--- a/tc/m_pedit.c
36cfb7
+++ b/tc/m_pedit.c
36cfb7
@@ -673,6 +673,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_sample.c b/tc/m_sample.c
36cfb7
index ff5ee6bd1ef63..31774c0e806b4 100644
36cfb7
--- a/tc/m_sample.c
36cfb7
+++ b/tc/m_sample.c
36cfb7
@@ -100,6 +100,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
36cfb7
index aa374fcb33ed9..c41a7bb082dad 100644
36cfb7
--- a/tc/m_skbedit.c
36cfb7
+++ b/tc/m_skbedit.c
36cfb7
@@ -123,6 +123,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
36cfb7
 	parse_action_control_dflt(&argc, &argv, &sel.action,
36cfb7
 				  false, TC_ACT_PIPE);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c
36cfb7
index ba79308ba8354..00318d42642a5 100644
36cfb7
--- a/tc/m_skbmod.c
36cfb7
+++ b/tc/m_skbmod.c
36cfb7
@@ -125,6 +125,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 
36cfb7
 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
36cfb7
index cdde64a15b929..0ff3f1a2b9876 100644
36cfb7
--- a/tc/m_tunnel_key.c
36cfb7
+++ b/tc/m_tunnel_key.c
36cfb7
@@ -197,6 +197,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 	parse_action_control_dflt(&argc, &argv, &parm.action,
36cfb7
 				  false, TC_ACT_PIPE);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/m_vlan.c b/tc/m_vlan.c
36cfb7
index cccb4996b05f3..0b2966ce82e53 100644
36cfb7
--- a/tc/m_vlan.c
36cfb7
+++ b/tc/m_vlan.c
36cfb7
@@ -137,6 +137,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
36cfb7
 	parse_action_control_dflt(&argc, &argv, &parm.action,
36cfb7
 				  false, TC_ACT_PIPE);
36cfb7
 
36cfb7
+	NEXT_ARG_FWD();
36cfb7
 	if (argc) {
36cfb7
 		if (matches(*argv, "index") == 0) {
36cfb7
 			NEXT_ARG();
36cfb7
diff --git a/tc/tc_util.c b/tc/tc_util.c
36cfb7
index cdc23477ada53..4584d4a448fb4 100644
36cfb7
--- a/tc/tc_util.c
36cfb7
+++ b/tc/tc_util.c
36cfb7
@@ -507,7 +507,6 @@ static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p,
36cfb7
 		}
36cfb7
 		result |= chain_index;
36cfb7
 	}
36cfb7
-	NEXT_ARG_FWD();
36cfb7
 	*argc_p = argc;
36cfb7
 	*argv_p = argv;
36cfb7
 	*result_p = result;
36cfb7
-- 
e138d9
2.21.0
36cfb7