Blame SOURCES/iptables-1.4.21-remove_duplicated_argument_parsing.patch

43df5c
Adapted version of
43df5c
43df5c
commit 6e2e169eb66b63d2991e1c7ada931e3cdb0ced32
43df5c
Author: Lorenzo Colitti <lorenzo@google.com>
43df5c
Date:   Thu Mar 16 16:55:01 2017 +0900
43df5c
43df5c
    iptables: remove duplicated argument parsing code
43df5c
    
43df5c
    1. Factor out repeated code to a new xs_has_arg function.
43df5c
    2. Add a new parse_wait_time option to parse the value of -w.
43df5c
    3. Make parse_wait_interval take argc and argv so its callers
43df5c
       can be simpler.
43df5c
    
43df5c
    Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
43df5c
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
43df5c
43df5c
diff -up iptables-1.4.21/iptables/ip6tables.c.remove_duplicated_argument_parsing iptables-1.4.21/iptables/ip6tables.c
43df5c
--- iptables-1.4.21/iptables/ip6tables.c.remove_duplicated_argument_parsing	2017-04-05 14:51:44.033970476 +0200
43df5c
+++ iptables-1.4.21/iptables/ip6tables.c	2017-04-05 14:51:44.044970566 +0200
43df5c
@@ -1388,8 +1388,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_DELETE, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!') {
43df5c
+			if (xs_has_arg(argc, argv)) {
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 				command = CMD_DELETE_NUM;
43df5c
 			}
43df5c
@@ -1399,8 +1398,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_REPLACE, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			else
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -1412,8 +1410,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_INSERT, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			else rulenum = 1;
43df5c
 			break;
43df5c
@@ -1422,11 +1419,9 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_LIST,
43df5c
 				    CMD_ZERO | CMD_ZERO_NUM, cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			break;
43df5c
 
43df5c
@@ -1434,11 +1429,9 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_LIST_RULES,
43df5c
 				    CMD_ZERO | CMD_ZERO_NUM, cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			break;
43df5c
 
43df5c
@@ -1446,8 +1439,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_FLUSH, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
 			break;
43df5c
 
43df5c
@@ -1455,11 +1447,9 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_ZERO, CMD_LIST|CMD_LIST_RULES,
43df5c
 				    cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				&& argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-				&& argv[optind][0] != '!') {
43df5c
+			if (xs_has_arg(argc, argv)) {
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 				command = CMD_ZERO_NUM;
43df5c
 			}
43df5c
@@ -1476,8 +1466,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_DELETE_CHAIN, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
 			break;
43df5c
 
43df5c
@@ -1485,8 +1474,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_RENAME_CHAIN, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				newname = argv[optind++];
43df5c
 			else
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -1499,8 +1487,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_SET_POLICY, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				policy = argv[optind++];
43df5c
 			else
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -1610,16 +1597,7 @@ int do_command6(int argc, char *argv[],
43df5c
 					      "You cannot use `-w' from "
43df5c
 					      "ip6tables-restore");
43df5c
 			}
43df5c
-			wait = -1;
43df5c
-			if (optarg) {
43df5c
-				if (sscanf(optarg, "%i", &wait) != 1)
43df5c
-					xtables_error(PARAMETER_PROBLEM,
43df5c
-						"wait seconds not numeric");
43df5c
-			} else if (optind < argc && argv[optind][0] != '-'
43df5c
-						 && argv[optind][0] != '!')
43df5c
-				if (sscanf(argv[optind++], "%i", &wait) != 1)
43df5c
-					xtables_error(PARAMETER_PROBLEM,
43df5c
-						"wait seconds not numeric");
43df5c
+			wait = parse_wait_time(argc, argv);
43df5c
 			break;
43df5c
 
43df5c
 		case 'W':
43df5c
@@ -1628,14 +1606,7 @@ int do_command6(int argc, char *argv[],
43df5c
 					      "You cannot use `-W' from "
43df5c
 					      "ip6tables-restore");
43df5c
 			}
43df5c
-			if (optarg)
43df5c
-				parse_wait_interval(optarg, &wait_interval);
43df5c
-			else if (optind < argc &&
43df5c
-				argv[optind][0] != '-' &&
43df5c
-				argv[optind][0] != '!')
43df5c
-				parse_wait_interval(argv[optind++],
43df5c
-						    &wait_interval);
43df5c
-
43df5c
+			parse_wait_interval(argc, argv, &wait_interval);
43df5c
 			wait_interval_set = true;
43df5c
 			break;
43df5c
 
43df5c
@@ -1685,8 +1656,7 @@ int do_command6(int argc, char *argv[],
43df5c
 			bcnt = strchr(pcnt + 1, ',');
43df5c
 			if (bcnt)
43df5c
 			    bcnt++;
43df5c
-			if (!bcnt && optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (!bcnt && xs_has_arg(argc, argv))
43df5c
 				bcnt = argv[optind++];
43df5c
 			if (!bcnt)
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
diff -up iptables-1.4.21/iptables/iptables.c.remove_duplicated_argument_parsing iptables-1.4.21/iptables/iptables.c
43df5c
--- iptables-1.4.21/iptables/iptables.c.remove_duplicated_argument_parsing	2017-04-05 14:51:44.034970484 +0200
43df5c
+++ iptables-1.4.21/iptables/iptables.c	2017-04-05 14:51:44.044970566 +0200
43df5c
@@ -1381,8 +1381,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_DELETE, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!') {
43df5c
+			if (xs_has_arg(argc, argv)) {
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 				command = CMD_DELETE_NUM;
43df5c
 			}
43df5c
@@ -1392,8 +1391,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_REPLACE, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			else
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -1405,8 +1403,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_INSERT, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			else rulenum = 1;
43df5c
 			break;
43df5c
@@ -1415,11 +1412,9 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_LIST,
43df5c
 				    CMD_ZERO | CMD_ZERO_NUM, cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			break;
43df5c
 
43df5c
@@ -1427,11 +1422,9 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_LIST_RULES,
43df5c
 				    CMD_ZERO|CMD_ZERO_NUM, cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 			break;
43df5c
 
43df5c
@@ -1439,8 +1432,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_FLUSH, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
 			break;
43df5c
 
43df5c
@@ -1448,11 +1440,9 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_ZERO, CMD_LIST|CMD_LIST_RULES,
43df5c
 				    cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				&& argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-				&& argv[optind][0] != '!') {
43df5c
+			if (xs_has_arg(argc, argv)) {
43df5c
 				rulenum = parse_rulenumber(argv[optind++]);
43df5c
 				command = CMD_ZERO_NUM;
43df5c
 			}
43df5c
@@ -1469,8 +1459,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_DELETE_CHAIN, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			if (optarg) chain = optarg;
43df5c
-			else if (optind < argc && argv[optind][0] != '-'
43df5c
-				 && argv[optind][0] != '!')
43df5c
+			else if (xs_has_arg(argc, argv))
43df5c
 				chain = argv[optind++];
43df5c
 			break;
43df5c
 
43df5c
@@ -1478,8 +1467,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_RENAME_CHAIN, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				newname = argv[optind++];
43df5c
 			else
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -1492,8 +1480,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			add_command(&command, CMD_SET_POLICY, CMD_NONE,
43df5c
 				    cs.invert);
43df5c
 			chain = optarg;
43df5c
-			if (optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (xs_has_arg(argc, argv))
43df5c
 				policy = argv[optind++];
43df5c
 			else
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -1601,16 +1588,7 @@ int do_command4(int argc, char *argv[],
43df5c
 					      "You cannot use `-w' from "
43df5c
 					      "iptables-restore");
43df5c
 			}
43df5c
-			wait = -1;
43df5c
-			if (optarg) {
43df5c
-				if (sscanf(optarg, "%i", &wait) != 1)
43df5c
-					xtables_error(PARAMETER_PROBLEM,
43df5c
-						"wait seconds not numeric");
43df5c
-			} else if (optind < argc && argv[optind][0] != '-'
43df5c
-						 && argv[optind][0] != '!')
43df5c
-				if (sscanf(argv[optind++], "%i", &wait) != 1)
43df5c
-					xtables_error(PARAMETER_PROBLEM,
43df5c
-						"wait seconds not numeric");
43df5c
+			wait = parse_wait_time(argc, argv);
43df5c
 			break;
43df5c
 
43df5c
 		case 'W':
43df5c
@@ -1619,14 +1597,7 @@ int do_command4(int argc, char *argv[],
43df5c
 					      "You cannot use `-W' from "
43df5c
 					      "iptables-restore");
43df5c
 			}
43df5c
-			if (optarg)
43df5c
-				parse_wait_interval(optarg, &wait_interval);
43df5c
-			else if (optind < argc &&
43df5c
-				 argv[optind][0] != '-' &&
43df5c
-				 argv[optind][0] != '!')
43df5c
-				parse_wait_interval(argv[optind++],
43df5c
-						    &wait_interval);
43df5c
-
43df5c
+			parse_wait_interval(argc, argv, &wait_interval);
43df5c
 			wait_interval_set = true;
43df5c
 			break;
43df5c
 
43df5c
@@ -1676,8 +1647,7 @@ int do_command4(int argc, char *argv[],
43df5c
 			bcnt = strchr(pcnt + 1, ',');
43df5c
 			if (bcnt)
43df5c
 			    bcnt++;
43df5c
-			if (!bcnt && optind < argc && argv[optind][0] != '-'
43df5c
-			    && argv[optind][0] != '!')
43df5c
+			if (!bcnt && xs_has_arg(argc, argv))
43df5c
 				bcnt = argv[optind++];
43df5c
 			if (!bcnt)
43df5c
 				xtables_error(PARAMETER_PROBLEM,
43df5c
diff -up iptables-1.4.21/iptables/xshared.c.remove_duplicated_argument_parsing iptables-1.4.21/iptables/xshared.c
43df5c
--- iptables-1.4.21/iptables/xshared.c.remove_duplicated_argument_parsing	2017-04-05 14:51:44.042970550 +0200
43df5c
+++ iptables-1.4.21/iptables/xshared.c	2017-04-05 14:51:44.045970574 +0200
43df5c
@@ -285,12 +285,36 @@ bool xtables_lock(int wait, struct timev
43df5c
 	}
43df5c
 }
43df5c
 
43df5c
-void parse_wait_interval(const char *str, struct timeval *wait_interval)
43df5c
+int parse_wait_time(int argc, char *argv[])
43df5c
 {
43df5c
+	int wait = -1;
43df5c
+
43df5c
+	if (optarg) {
43df5c
+		if (sscanf(optarg, "%i", &wait) != 1)
43df5c
+			xtables_error(PARAMETER_PROBLEM,
43df5c
+				"wait seconds not numeric");
43df5c
+	} else if (xs_has_arg(argc, argv))
43df5c
+		if (sscanf(argv[optind++], "%i", &wait) != 1)
43df5c
+			xtables_error(PARAMETER_PROBLEM,
43df5c
+				"wait seconds not numeric");
43df5c
+
43df5c
+	return wait;
43df5c
+}
43df5c
+
43df5c
+void parse_wait_interval(int argc, char *argv[], struct timeval *wait_interval)
43df5c
+{
43df5c
+	const char *arg;
43df5c
 	unsigned int usec;
43df5c
 	int ret;
43df5c
 
43df5c
-	ret = sscanf(str, "%u", &usec);
43df5c
+	if (optarg)
43df5c
+		arg = optarg;
43df5c
+	else if (xs_has_arg(argc, argv))
43df5c
+		arg = argv[optind++];
43df5c
+	else
43df5c
+		return;
43df5c
+
43df5c
+	ret = sscanf(arg, "%u", &usec);
43df5c
 	if (ret == 1) {
43df5c
 		if (usec > 999999)
43df5c
 			xtables_error(PARAMETER_PROBLEM,
43df5c
@@ -303,3 +327,10 @@ void parse_wait_interval(const char *str
43df5c
 	}
43df5c
 	xtables_error(PARAMETER_PROBLEM, "wait interval not numeric");
43df5c
 }
43df5c
+
43df5c
+inline bool xs_has_arg(int argc, char *argv[])
43df5c
+{
43df5c
+	return optind < argc &&
43df5c
+	       argv[optind][0] != '-' &&
43df5c
+	       argv[optind][0] != '!';
43df5c
+}
43df5c
diff -up iptables-1.4.21/iptables/xshared.h.remove_duplicated_argument_parsing iptables-1.4.21/iptables/xshared.h
43df5c
--- iptables-1.4.21/iptables/xshared.h.remove_duplicated_argument_parsing	2017-04-05 14:51:44.034970484 +0200
43df5c
+++ iptables-1.4.21/iptables/xshared.h	2017-04-05 14:51:44.045970574 +0200
43df5c
@@ -86,7 +86,9 @@ extern void xs_init_target(struct xtable
43df5c
 extern void xs_init_match(struct xtables_match *);
43df5c
 bool xtables_lock(int wait, struct timeval *wait_interval);
43df5c
 
43df5c
-void parse_wait_interval(const char *str, struct timeval *wait_interval);
43df5c
+int parse_wait_time(int argc, char *argv[]);
43df5c
+void parse_wait_interval(int argc, char *argv[], struct timeval *wait_interval);
43df5c
+bool xs_has_arg(int argc, char *argv[]);
43df5c
 
43df5c
 extern const struct xtables_afinfo *afinfo;
43df5c