[PATCH] libosmocore[master]: osmo_hexparse: allow whitespace in parsed string, add ws test

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Tue Feb 14 14:57:59 UTC 2017


Review at  https://gerrit.osmocom.org/1820

osmo_hexparse: allow whitespace in parsed string, add ws test

Change-Id: Ib7af07f674a2d26c8569acdee98835fb3e626c45
---
M src/utils.c
M tests/utils/utils_test.c
M tests/utils/utils_test.ok
3 files changed, 51 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/20/1820/1

diff --git a/src/utils.c b/src/utils.c
index 34b2bca..1a4aab4 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -127,16 +127,22 @@
 int osmo_hexparse(const char *str, uint8_t *b, int max_len)
 
 {
-	int i, l, v;
-
-	l = strlen(str);
-	if ((l&1) || ((l>>1) > max_len))
-		return -1;
+	char c;
+	uint8_t v;
+	const char *strpos;
+	unsigned int nibblepos = 0;
 
 	memset(b, 0x00, max_len);
 
-	for (i=0; i<l; i++) {
-		char c = str[i];
+	for (strpos = str; (c = *strpos); strpos++) {
+		/* skip whitespace */
+		if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
+			continue;
+
+		/* If the buffer is too small, error out */
+		if (nibblepos >= (max_len << 1))
+			return -1;
+
 		if (c >= '0' && c <= '9')
 			v = c - '0';
 		else if (c >= 'a' && c <= 'f')
@@ -145,10 +151,17 @@
 			v = 10 + (c - 'A');
 		else
 			return -1;
-		b[i>>1] |= v << (i&1 ? 0 : 4);
+
+		b[nibblepos >> 1] |= v << (nibblepos & 1 ? 0 : 4);
+		nibblepos ++;
 	}
 
-	return i>>1;
+	/* In case of uneven amount of digits, the last byte is not complete
+	 * and that's an error. */
+	if (nibblepos & 1)
+		return -1;
+
+	return nibblepos >> 1;
 }
 
 static char hexd_buff[4096];
diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c
index e3d6221..cad162d 100644
--- a/tests/utils/utils_test.c
+++ b/tests/utils/utils_test.c
@@ -124,6 +124,31 @@
 	for (i = 0; i < sizeof(data); i++)
 		OSMO_ASSERT(data[i] == i);
 
+	printf("Hexparse 0..255 with whitespace\n");
+	memset(data, 0, sizeof(data));
+	rc = osmo_hexparse(
+		"00 01\t02\r030405060708090A0B0C0D0 E  0    F\n"
+		"10 11\t12\r131415161718191A1B1C1D1 E  1    F\n"
+		"20 21\t22\r232425262728292A2B2C2D2 E  2    F\n"
+		"30 31\t32\r333435363738393a3b3c3d3 e  3    f\n"
+		"40 41\t42\r434445464748494A4B4C4D4 E  4    F\n"
+		"50 51\t52\r535455565758595a5b5c5d5 e  5    f\n"
+		"60 61\t62\r636465666768696A6B6C6D6 E  6    F\n"
+		"70 71\t72\r737475767778797A7B7C7D7 E  7    F\n"
+		"80 81\t82\r838485868788898A8B8C8D8 E  8    F\n"
+		"90 91\t92\r939495969798999A9B9C9D9 E  9    F\n"
+		"A0 A1\tA2\rA3a4a5a6a7a8a9AAABACADA E  A    F\n"
+		"B0 B1\tB2\rB3b4b5b6b7b8b9BABBBCBDB E  B    F\n"
+		"C0 C1\tC2\rC3c4c5c6c7c8c9CACBCCCDC E  C    F \n"
+		"D0 D1\tD2\rD3d4d5d6d7d8d9DADBDCDDD E  D    F\t\n"
+		"E0 E1\tE2\rE3e4e5e6e7e8e9EAEBECEDE E  E    F \t\n"
+		"F0 F1\tF2\rF3f4f5f6f7f8f9FAFBFCFDF E  F    F \t\r\n"
+		, data, sizeof(data));
+	printf("rc = %d\n", rc);
+	printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
+	for (i = 0; i < sizeof(data); i++)
+		OSMO_ASSERT(data[i] == i);
+
 	printf("Hexparse with buffer too short\n");
 	memset(data, 0, sizeof(data));
 	rc = osmo_hexparse("000102030405060708090a0b0c0d0e0f", data, 15);
diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok
index 0f7e7a0..e9be018 100644
--- a/tests/utils/utils_test.ok
+++ b/tests/utils/utils_test.ok
@@ -16,6 +16,10 @@
 rc = 256
 --> 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 
 
+Hexparse 0..255 with whitespace
+rc = 256
+--> 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 
+
 Hexparse with buffer too short
 rc = -1
 Hexparse with uneven amount of digits

-- 
To view, visit https://gerrit.osmocom.org/1820
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib7af07f674a2d26c8569acdee98835fb3e626c45
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>


More information about the gerrit-log mailing list