[v2] app/testpmd: fix hex string parser input length
Checks
Commit Message
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: stable@dpdk.org
Fixes: 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")
Signed-off-by: Gregory Etelson <getelson@nvidia.com>
---
v2: return error after snprintf failure.
---
app/test-pmd/cmdline_flow.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
@@ -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;
}