]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util-lib: be stricter when decoding hex strings
authorLennart Poettering <lennart@poettering.net>
Fri, 16 Dec 2016 12:08:29 +0000 (13:08 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 21 Dec 2016 18:09:31 +0000 (19:09 +0100)
If a hex string has an uneven length, generate an error instead of
silently assuming a trailing '0' was in place.

src/basic/hexdecoct.c
src/test/test-hexdecoct.c

index c5bda6c4d68db6b69f2ec8a5d996f3928045ee98..6843aedd0a2b781bcd2821ace0a5584936a3252d 100644 (file)
@@ -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;
         }
index 276f25d09125afba5fdb1eff0674606d8472c39a..fcae427e742f5f07337d731abf36dbf08549a5da 100644 (file)
@@ -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 */