From 2acf7432ad3e67f676d7d14a6acc3b90a2d9117e Mon Sep 17 00:00:00 2001 From: Xueming Li Date: Sat, 20 Jan 2018 02:16:10 +0800 Subject: [PATCH] cmdline: fix dynamic tokens parsing 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 Acked-by: Olivier Matz --- lib/librte_cmdline/cmdline_parse.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/librte_cmdline/cmdline_parse.c b/lib/librte_cmdline/cmdline_parse.c index 3e12ee54fd..c74b146fcc 100644 --- a/lib/librte_cmdline/cmdline_parse.c +++ b/lib/librte_cmdline/cmdline_parse.c @@ -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 */ -- 2.20.1