Hi Olivier, Almost forgot this one, my original proposal for CLI issue. Split out according to your suggestion.
Thanks, Xueming > -----Original Message----- > From: Xueming Li [mailto:xuemi...@mellanox.com] > Sent: Saturday, January 20, 2018 10:26 AM > To: Olivier MATZ <olivier.m...@6wind.com> > Cc: Xueming(Steven) Li <xuemi...@mellanox.com>; dev@dpdk.org; Adrien > Mazarguil <adrien.mazarg...@6wind.com>; sta...@dpdk.org > 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: sta...@dpdk.org > Signed-off-by: Xueming Li <xuemi...@mellanox.com> > --- > 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 3e12ee54f..c74b146fc 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.13.3