Skip to contentSkip to conversation

app/testpmd: fix hex string parser input length

PATCH Superseded Gregory Etelson 2 participants 4 messages Nov 23, 2021 – Nov 24, 2021

lore
Share & tools
lore
#0 lore raw

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.

Fixes 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")
---
 app/test-pmd/cmdline_flow.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)
app/test-pmd/cmdline_flow.c +14 -14
index 1b00ae507b..2b90a4a23a 100644
@@ -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
#1 lore raw

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.

Fixes 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")

---
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
index 1b00ae507b..dcf8ebec45 100644
@@ -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
#2 lore raw

PATCH v3 1/1 app/testpmd: fix hex string parser input length

In reply to 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 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

Fixes 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")

---
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
index 1b00ae507b..bbe3dc0115 100644
@@ -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
Applied
#3 lore raw
Quoted 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 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

Quoted 5 lines
Fixes 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")

Applied to dpdk-next-net/main, thanks.