cmdline: fix dynamic tokens parsing
authorXueming Li <xuemingl@mellanox.com>
Fri, 19 Jan 2018 18:16:10 +0000 (02:16 +0800)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 25 Jan 2018 22:13:57 +0000 (23:13 +0100)
When using dynamic tokens, the result buffer contains pointers to some
location inside the result buffer. When the content of the temporary
buffer is copied in the final one, these pointers still point to the
temporary buffer.

This works until the temporary buffer is kept intact, but the next
commit introduces a memset() that breaks this assumption.

This commit keeps the successfully parsed buffers, and ensures that the
pointers point to the valid location, by using temp buffer for following
parsing.

Fixes: 9b3fbb051d2e ("cmdline: fix parsing")
Cc: stable@dpdk.org
Signed-off-by: Xueming Li <xuemingl@mellanox.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_cmdline/cmdline_parse.c

index 3e12ee5..c74b146 100644 (file)
@@ -263,6 +263,7 @@ cmdline_parse(struct cmdline *cl, const char * buf)
 #ifdef RTE_LIBRTE_CMDLINE_DEBUG
        char debug_buf[BUFSIZ];
 #endif
+       char *result_buf = result.buf;
 
        if (!cl || !buf)
                return CMDLINE_PARSE_BAD_ARGS;
@@ -312,16 +313,14 @@ cmdline_parse(struct cmdline *cl, const char * buf)
                debug_printf("INST %d\n", inst_num);
 
                /* fully parsed */
-               tok = match_inst(inst, buf, 0, tmp_result.buf,
-                                sizeof(tmp_result.buf));
+               tok = match_inst(inst, buf, 0, result_buf,
+                                CMDLINE_PARSE_RESULT_BUFSIZE);
 
                if (tok > 0) /* we matched at least one token */
                        err = CMDLINE_PARSE_BAD_ARGS;
 
                else if (!tok) {
                        debug_printf("INST fully parsed\n");
-                       memcpy(&result, &tmp_result,
-                              sizeof(result));
                        /* skip spaces */
                        while (isblank2(*curbuf)) {
                                curbuf++;
@@ -332,6 +331,7 @@ cmdline_parse(struct cmdline *cl, const char * buf)
                                if (!f) {
                                        memcpy(&f, &inst->f, sizeof(f));
                                        memcpy(&data, &inst->data, sizeof(data));
+                                       result_buf = tmp_result.buf;
                                }
                                else {
                                        /* more than 1 inst matches */