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 <m...@pmachata.org>
---
 lib/utils.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/lib/utils.c b/lib/utils.c
index 93521a49eaec..87cc6ae0cfba 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -1781,6 +1781,7 @@ int parse_mapping(int *argcp, char ***argvp,
 {
        int argc = *argcp;
        char **argv = *argvp;
+       int ret = 0;
 
        while (argc > 0) {
                char *colon = strchr(*argv, ':');
@@ -1790,15 +1791,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;
 }
-- 
2.25.1

Reply via email to