app/testpmd: fix hex string parser input length
PATCH 1/1 app/testpmd: fix hex string parser input length
Current hex string parser assumes input has even characters number. The parser fails input string with odd length.
The patch parses hex stringhs with even and odd length.
--- app/test-pmd/cmdline_flow.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
app/test-pmd/cmdline_flow.c +14 -14
@@ -7702,9 +7702,7 @@ parse_string(struct context *ctx, const struct token *token,static int parse_hex_string (const char *src,uint8_t *dst,uint32_t *size) { -char *c =NULL ; -uint32_t i, len; -char tmp[3 ]; +uint32_t left = *size;/* Check input parameters */ if ((src == NULL) ||
@@ -7714,19 +7712,21 @@ parse_hex_string(const char *src, uint8_t *dst, uint32_t *size)return -1 ;/* Convert chars to bytes */ -for (i =0 , len =0 ; i < *size; i +=2 ) { -snprintf (tmp,3 ,"%s" , src + i); - dst[len++] =strtoul (tmp, &c,16 ); -if (*c !=0 ) { - len--; - dst[len] =0 ; - *size = len; -return -1 ; +while (left) { +char tmp[3 ], *end = tmp; +uint32_t read_lim = left &1 ?1 :2 ; + +snprintf (tmp, read_lim +1 ,"%s" , src); + *dst =strtoul (tmp, &end,16 ); +if (*end) { + *dst =0 ; + *size = *size - left; } + left -= read_lim; + src += read_lim; + dst++; } - dst[len] =0 ; - *size = len; - + *dst =0 ;return 0 ; }
Signature · 1 line
2.34.0
PATCH v2 1/1 app/testpmd: fix hex string parser input length
Current hex string parser assumes input has even characters number. The parser fails input string with odd length.
The patch parses hex stringhs with even and odd length.
---
v2: return error after snprintf failure.
--- app/test-pmd/cmdline_flow.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
app/test-pmd/cmdline_flow.c +14 -13
@@ -7702,9 +7702,7 @@ parse_string(struct context *ctx, const struct token *token,static int parse_hex_string (const char *src,uint8_t *dst,uint32_t *size) { -char *c =NULL ; -uint32_t i, len; -char tmp[3 ]; +uint32_t left = *size;/* Check input parameters */ if ((src == NULL) ||
@@ -7714,19 +7712,22 @@ parse_hex_string(const char *src, uint8_t *dst, uint32_t *size)return -1 ;/* Convert chars to bytes */ -for (i =0 , len =0 ; i < *size; i +=2 ) { -snprintf (tmp,3 ,"%s" , src + i); - dst[len++] =strtoul (tmp, &c,16 ); -if (*c !=0 ) { - len--; - dst[len] =0 ; - *size = len; +while (left) { +char tmp[3 ], *end = tmp; +uint32_t read_lim = left &1 ?1 :2 ; + +snprintf (tmp, read_lim +1 ,"%s" , src); + *dst =strtoul (tmp, &end,16 ); +if (*end) { + *dst =0 ; + *size = *size - left;return -1 ; } + left -= read_lim; + src += read_lim; + dst++; } - dst[len] =0 ; - *size = len; - + *dst =0 ;return 0 ; }
Signature · 1 line
2.34.0
PATCH v3 1/1 app/testpmd: fix hex string parser input length
In reply to Gregory EtelsonCurrent hex string parser assumes input has even characters number. The parser fails input string with odd length.
The patch parses hex strings with even and odd length. Parse result of an input with odd length will match result of even length input, that has 0 as MSB, following by the original sequence.
For example:
"0x1" results in *dst={0x01, 0x00}, *size=1
"0xabc" results in *dst={0x0a, 0xbc, 0x00}, *size=2
---
v2: Return error after snprintf failure.
v3: Update returned size.
Update the patch comment.
--- app/test-pmd/cmdline_flow.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
app/test-pmd/cmdline_flow.c +16 -13
@@ -7702,9 +7702,8 @@ parse_string(struct context *ctx, const struct token *token,static int parse_hex_string (const char *src,uint8_t *dst,uint32_t *size) { -char *c =NULL ; -uint32_t i, len; -char tmp[3 ]; +uint32_t left = *size; +const uint8_t *head = dst;/* Check input parameters */ if ((src == NULL) ||
@@ -7714,19 +7713,23 @@ parse_hex_string(const char *src, uint8_t *dst, uint32_t *size)return -1 ;/* Convert chars to bytes */ -for (i =0 , len =0 ; i < *size; i +=2 ) { -snprintf (tmp,3 ,"%s" , src + i); - dst[len++] =strtoul (tmp, &c,16 ); -if (*c !=0 ) { - len--; - dst[len] =0 ; - *size = len; +while (left) { +char tmp[3 ], *end = tmp; +uint32_t read_lim = left &1 ?1 :2 ; + +snprintf (tmp, read_lim +1 ,"%s" , src); + *dst =strtoul (tmp, &end,16 ); +if (*end) { + *dst =0 ; + *size = (uint32_t )(dst - head);return -1 ; } + left -= read_lim; + src += read_lim; + dst++; } - dst[len] =0 ; - *size = len; - + *dst =0 ; + *size = (uint32_t )(dst - head);return 0 ; }
Signature · 1 line
2.34.0
Ferruh Yigit
AppliedQuoted 11 lines · Gregory Etelson
Current hex string parser assumes input has even characters number. The parser fails input string with odd length.
The patch parses hex strings with even and odd length. Parse result of an input with odd length will match result of even length input, that has
0as MSB, following by the original sequence.
For example:
"0x1" results in *dst={0x01,0x00}, *size=1
"0xabc" results in *dst={0x0a,0xbc,0x00}, *size=2
Quoted 5 lines
Fixes 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")Signed-off-by Gregory Etelson <[email protected]>Reviewed-by Viacheslav Ovsiienko <[email protected]>
Applied to dpdk-next-net/main, thanks.