[dpdk-dev] cmdline: fix dynamic tokens parsing

Message ID 20180120022554.131490-1-xuemingl@mellanox.com (mailing list archive)
State Not Applicable, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Xueming Li Jan. 20, 2018, 2:25 a.m. UTC
  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>
---
 lib/librte_cmdline/cmdline_parse.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
  

Comments

Xueming Li Jan. 20, 2018, 2:30 a.m. UTC | #1
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:xuemingl@mellanox.com]

> Sent: Saturday, January 20, 2018 10:26 AM

> To: Olivier MATZ <olivier.matz@6wind.com>

> Cc: Xueming(Steven) Li <xuemingl@mellanox.com>; dev@dpdk.org; Adrien

> Mazarguil <adrien.mazarguil@6wind.com>; stable@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: stable@dpdk.org

> Signed-off-by: Xueming Li <xuemingl@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
  
Xueming Li Jan. 20, 2018, 3:27 a.m. UTC | #2
Sorry, sent wrong patch, please ignore this one.

> -----Original Message-----

> From: Xueming(Steven) Li

> Sent: Saturday, January 20, 2018 10:30 AM

> To: Xueming(Steven) Li <xuemingl@mellanox.com>; Olivier MATZ

> <olivier.matz@6wind.com>

> Cc: dev@dpdk.org; Adrien Mazarguil <adrien.mazarguil@6wind.com>;

> stable@dpdk.org

> Subject: RE: [PATCH] cmdline: fix dynamic tokens parsing

> 

> 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:xuemingl@mellanox.com]

> > Sent: Saturday, January 20, 2018 10:26 AM

> > To: Olivier MATZ <olivier.matz@6wind.com>

> > Cc: Xueming(Steven) Li <xuemingl@mellanox.com>; dev@dpdk.org; Adrien

> > Mazarguil <adrien.mazarguil@6wind.com>; stable@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: stable@dpdk.org

> > Signed-off-by: Xueming Li <xuemingl@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
  

Patch

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 */