diff mbox series

[v3] app/testpmd: fix hex string parser input length

Message ID 20211124123354.6462-1-getelson@nvidia.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers show
Series [v3] app/testpmd: fix hex string parser input length | expand

Checks

Context Check Description
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/github-robot: build success github build: passed
ci/intel-Testing success Testing PASS
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Gregory Etelson Nov. 24, 2021, 12:33 p.m. UTC
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

Cc: stable@dpdk.org

Fixes: 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")
Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Reviewed-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
---
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(-)

Comments

Ferruh Yigit Nov. 24, 2021, 4:37 p.m. UTC | #1
On 11/24/2021 12:33 PM, Gregory Etelson wrote:
> 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
> 
> Cc: stable@dpdk.org
> 
> Fixes: 169a9fed1f4c ("app/testpmd: fix hex string parser support for flow API")
> Signed-off-by: Gregory Etelson <getelson@nvidia.com>
> Reviewed-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>

Applied to dpdk-next-net/main, thanks.
diff mbox series

Patch

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