Hi Wenzhuo, On Thu, 20 Apr 2017 08:36:38 +0000, "Lu, Wenzhuo" <wenzhuo...@intel.com> wrote: > Hi Olivier, > I met a problem thar the parsing result of CLI is wrong. > I checked this function, cmdline_parse. It will check the CLI instances one > by one. Even if an instance is matched, the parsing will not stop for > ambiguous check. Seems the following check may change the parsing result of > the previous one, > /* fully parsed */ > tok = match_inst(inst, buf, 0, result.buf, > sizeof(result.buf), > &dyn_tokens); > > > Is it better to use a temporary validate for match_inst and only store the > result when it matches, so the previous result has no chance to be changed? > Like bellow, > > > diff --git a/lib/librte_cmdline/cmdline_parse.c > b/lib/librte_cmdline/cmdline_parse.c > index 763c286..663efd1 100644 > --- a/lib/librte_cmdline/cmdline_parse.c > +++ b/lib/librte_cmdline/cmdline_parse.c > @@ -259,6 +259,7 @@ > char buf[CMDLINE_PARSE_RESULT_BUFSIZE]; > long double align; /* strong alignment constraint for buf */ > } result; > + char tmp_buf[CMDLINE_PARSE_RESULT_BUFSIZE]; > cmdline_parse_token_hdr_t *dyn_tokens[CMDLINE_PARSE_DYNAMIC_TOKENS]; > void (*f)(void *, struct cmdline *, void *) = NULL; > void *data = NULL; > @@ -321,7 +322,7 @@ > debug_printf("INST %d\n", inst_num); > > /* fully parsed */ > - tok = match_inst(inst, buf, 0, result.buf, sizeof(result.buf), > + tok = match_inst(inst, buf, 0, tmp_buf, sizeof(tmp_buf), > &dyn_tokens); > > if (tok > 0) /* we matched at least one token */ > @@ -329,6 +330,8 @@ > > else if (!tok) { > debug_printf("INST fully parsed\n"); > + memcpy(result.buf, tmp_buf, > + CMDLINE_PARSE_RESULT_BUFSIZE); > /* skip spaces */ > while (isblank2(*curbuf)) { > curbuf++; > >
At first glance, I think your patch doesn't hurt. Do you have an example code that triggers the issue? Thanks, Olivier