]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
hexdecoct: fix NULL pointer dereferences in hexmem()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 7 Dec 2022 00:06:48 +0000 (09:06 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 8 Dec 2022 19:55:47 +0000 (04:55 +0900)
Fixes oss-fuzz#54090 (https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=54090).

Fixes #25655.

src/basic/hexdecoct.c
src/test/test-hexdecoct.c
test/fuzz/fuzz-resource-record/oss-fuzz-54090 [new file with mode: 0644]

index b9de5bfcdaf91f5e3c7fc726b31efbc829dbef32..0ff8eb3256eefac039c09fd82d8a4f5d7e17787b 100644 (file)
@@ -59,11 +59,13 @@ char *hexmem(const void *p, size_t l) {
         const uint8_t *x;
         char *r, *z;
 
+        assert(p || l == 0);
+
         z = r = new(char, l * 2 + 1);
         if (!r)
                 return NULL;
 
-        for (x = p; x < (const uint8_t*) p + l; x++) {
+        for (x = p; x && x < (const uint8_t*) p + l; x++) {
                 *(z++) = hexchar(*x >> 4);
                 *(z++) = hexchar(*x & 15);
         }
index 4657307580b1938be7bd3eb08bcf0fb7bc6d94d4..afdc3b543681e37f351d2bca548abb2dd0148b6d 100644 (file)
@@ -73,6 +73,25 @@ TEST(undecchar) {
         assert_se(undecchar('9') == 9);
 }
 
+static void test_hexmem_one(const char *in, const char *expected) {
+        _cleanup_free_ char *result = NULL;
+        _cleanup_free_ void *mem = NULL;
+        size_t len;
+
+        assert_se(result = hexmem(in, strlen_ptr(in)));
+        log_debug("hexmem(\"%s\") → \"%s\" (expected: \"%s\")", strnull(in), result, expected);
+        assert_se(streq(result, expected));
+
+        assert_se(unhexmem(result, SIZE_MAX, &mem, &len) >= 0);
+        assert_se(memcmp_safe(mem, in, len) == 0);
+}
+
+TEST(hexmem) {
+        test_hexmem_one(NULL, "");
+        test_hexmem_one("", "");
+        test_hexmem_one("foo", "666f6f");
+}
+
 static void test_unhexmem_one(const char *s, size_t l, int retval) {
         _cleanup_free_ char *hex = NULL;
         _cleanup_free_ void *mem = NULL;
diff --git a/test/fuzz/fuzz-resource-record/oss-fuzz-54090 b/test/fuzz/fuzz-resource-record/oss-fuzz-54090
new file mode 100644 (file)
index 0000000..994d908
Binary files /dev/null and b/test/fuzz/fuzz-resource-record/oss-fuzz-54090 differ