mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 16:37:19 +09:00
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.
This commit is contained in:
@@ -97,6 +97,9 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
|
||||
assert(len);
|
||||
assert(p);
|
||||
|
||||
if (l % 2 != 0)
|
||||
return -EINVAL;
|
||||
|
||||
z = r = malloc((l + 1) / 2 + 1);
|
||||
if (!r)
|
||||
return -ENOMEM;
|
||||
@@ -107,12 +110,10 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
|
||||
a = unhexchar(x[0]);
|
||||
if (a < 0)
|
||||
return a;
|
||||
else if (x+1 < p + l) {
|
||||
b = unhexchar(x[1]);
|
||||
if (b < 0)
|
||||
return b;
|
||||
} else
|
||||
b = 0;
|
||||
|
||||
b = unhexchar(x[1]);
|
||||
if (b < 0)
|
||||
return b;
|
||||
|
||||
*(z++) = (uint8_t) a << 4 | (uint8_t) b;
|
||||
}
|
||||
|
||||
@@ -87,27 +87,19 @@ static void test_undecchar(void) {
|
||||
}
|
||||
|
||||
static void test_unhexmem(void) {
|
||||
const char *hex = "efa214921";
|
||||
const char *hex = "efa2149213";
|
||||
const char *hex_invalid = "efa214921o";
|
||||
_cleanup_free_ char *hex2 = NULL;
|
||||
_cleanup_free_ void *mem = NULL;
|
||||
size_t len;
|
||||
|
||||
assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
|
||||
assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
|
||||
assert_se(unhexmem(hex_invalid, strlen(hex_invalid), &mem, &len) == -EINVAL);
|
||||
assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
|
||||
assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == -EINVAL);
|
||||
assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
|
||||
|
||||
assert_se((hex2 = hexmem(mem, len)));
|
||||
|
||||
free(mem);
|
||||
|
||||
assert_se(memcmp(hex, hex2, strlen(hex)) == 0);
|
||||
|
||||
free(hex2);
|
||||
|
||||
assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == 0);
|
||||
assert_se((hex2 = hexmem(mem, len)));
|
||||
assert_se(memcmp(hex, hex2, strlen(hex) - 1) == 0);
|
||||
assert_se(streq(hex, hex2));
|
||||
}
|
||||
|
||||
/* https://tools.ietf.org/html/rfc4648#section-10 */
|
||||
|
||||
Reference in New Issue
Block a user