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

Reply via email to