diff mbox series

[iproute2-next,v4,08/11] lib: parse_mapping: Update argc, argv on error

Message ID c7f122316070b78c1dccf23c86585d03be55d633.1604869679.git.me@pmachata.org (mailing list archive)
State Not Applicable
Delegated to: Stephen Hemminger
Headers show
Series Add a tool for configuration of DCB | expand

Commit Message

Petr Machata Nov. 8, 2020, 9:14 p.m. UTC
Currently argc and argv are not updated unless parsing of all of the
mapping was successful. However in that case, "ip link" will point at the
wrong argument when complaining:

    # ip link add name eth0.100 link eth0 type vlan id 100 egress 1:1 2:foo
    Error: argument "1" is wrong: invalid egress-qos-map

Update argc and argv even in the case of parsing error, so that the right
element is indicated.

Signed-off-by: Petr Machata <me@pmachata.org>
---
 lib/utils.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/lib/utils.c b/lib/utils.c
index 1dfaaf564915..67d64df7e3e6 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -1770,6 +1770,7 @@  int parse_mapping(int *argcp, char ***argvp,
 {
 	int argc = *argcp;
 	char **argv = *argvp;
+	int ret = 0;
 
 	while (argc > 0) {
 		char *colon = strchr(*argv, ':');
@@ -1779,15 +1780,19 @@  int parse_mapping(int *argcp, char ***argvp,
 			break;
 		*colon = '\0';
 
-		if (get_u32(&key, *argv, 0))
-			return 1;
-		if (mapping_cb(key, colon + 1, mapping_cb_data))
-			return 1;
+		if (get_u32(&key, *argv, 0)) {
+			ret = 1;
+			break;
+		}
+		if (mapping_cb(key, colon + 1, mapping_cb_data)) {
+			ret = 1;
+			break;
+		}
 
 		argc--, argv++;
 	}
 
 	*argcp = argc;
 	*argvp = argv;
-	return 0;
+	return ret;
 }