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.

Cc: sta...@dpdk.org

Fixes: 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")
Signed-off-by: Gregory Etelson <getel...@nvidia.com>
---
 app/test-pmd/cmdline_flow.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 1b00ae507b..2b90a4a23a 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -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;
 }
 
-- 
2.34.0

Reply via email to