Skip to content

Commit a93c477

Browse files
committed
util-lib: be stricter when decoding hex strings
If a hex string has an uneven length, generate an error instead of silently assuming a trailing '0' was in place.
1 parent c0cee5f commit a93c477

File tree

2 files changed

+12
-19
lines changed

2 files changed

+12
-19
lines changed

src/basic/hexdecoct.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
9797
assert(len);
9898
assert(p);
9999

100+
if (l % 2 != 0)
101+
return -EINVAL;
102+
100103
z = r = malloc((l + 1) / 2 + 1);
101104
if (!r)
102105
return -ENOMEM;
@@ -107,12 +110,10 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
107110
a = unhexchar(x[0]);
108111
if (a < 0)
109112
return a;
110-
else if (x+1 < p + l) {
111-
b = unhexchar(x[1]);
112-
if (b < 0)
113-
return b;
114-
} else
115-
b = 0;
113+
114+
b = unhexchar(x[1]);
115+
if (b < 0)
116+
return b;
116117

117118
*(z++) = (uint8_t) a << 4 | (uint8_t) b;
118119
}

src/test/test-hexdecoct.c

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,27 +87,19 @@ static void test_undecchar(void) {
8787
}
8888

8989
static void test_unhexmem(void) {
90-
const char *hex = "efa214921";
90+
const char *hex = "efa2149213";
9191
const char *hex_invalid = "efa214921o";
9292
_cleanup_free_ char *hex2 = NULL;
9393
_cleanup_free_ void *mem = NULL;
9494
size_t len;
9595

96-
assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
97-
assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
9896
assert_se(unhexmem(hex_invalid, strlen(hex_invalid), &mem, &len) == -EINVAL);
97+
assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
98+
assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == -EINVAL);
99+
assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
99100

100101
assert_se((hex2 = hexmem(mem, len)));
101-
102-
free(mem);
103-
104-
assert_se(memcmp(hex, hex2, strlen(hex)) == 0);
105-
106-
free(hex2);
107-
108-
assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == 0);
109-
assert_se((hex2 = hexmem(mem, len)));
110-
assert_se(memcmp(hex, hex2, strlen(hex) - 1) == 0);
102+
assert_se(streq(hex, hex2));
111103
}
112104

113105
/* https://tools.ietf.org/html/rfc4648#section-10 */

0 commit comments

Comments
 (0)