]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journald: do not read configs by journald fuzzers
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 13 Jul 2025 08:19:46 +0000 (17:19 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 18 Jul 2025 06:27:37 +0000 (15:27 +0900)
src/journal/fuzz-journald-audit.c
src/journal/fuzz-journald-kmsg.c
src/journal/fuzz-journald-native-fd.c
src/journal/fuzz-journald-stream.c
src/journal/fuzz-journald.c
src/journal/fuzz-journald.h
src/journal/journald-config.c
src/journal/journald-config.h
src/journal/journald-manager.c
src/journal/journald-manager.h
src/journal/journald.c

index 7558900ff51cb12e5e2fe998d79253bc811aafdd..07470ecd2f0364fefaf41ffff804f493e31b84f3 100644 (file)
@@ -9,8 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
 
         fuzz_setup_logging();
 
-        assert_se(manager_new(&m, /* namespace= */ NULL) >= 0);
-        dummy_manager_init(m, data, size);
+        dummy_manager_new(&m, data, size);
         process_audit_string(m, 0, m->buffer, size);
 
         return 0;
index 2ef36172887cff96525016a2547aa5b391c9ea0c..041662686e27fb9b60fc420d9001ae7a319aabcc 100644 (file)
@@ -12,8 +12,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
 
         fuzz_setup_logging();
 
-        assert_se(manager_new(&m, /* namespace= */ NULL) >= 0);
-        dummy_manager_init(m, data, size);
+        dummy_manager_new(&m, data, size);
         dev_kmsg_record(m, m->buffer, size);
 
         return 0;
index 356e59046fbe3700053c41e219110aa9b80c13a2..a6ff87556d82a63a8ae5824effb670feb271431d 100644 (file)
@@ -21,8 +21,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
 
         fuzz_setup_logging();
 
-        assert_se(manager_new(&m, /* namespace= */ NULL) >= 0);
-        dummy_manager_init(m, NULL, 0);
+        dummy_manager_new(&m, NULL, 0);
 
         sealed_fd = memfd_new_and_seal(NULL, data, size);
         assert_se(sealed_fd >= 0);
index 602bd59c45f3b57315a84899fb22dfcfecea5660..1ee49461d394d3e6c059d268a7994606dde3862c 100644 (file)
@@ -23,8 +23,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         fuzz_setup_logging();
 
         assert_se(socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0, stream_fds) >= 0);
-        assert_se(manager_new(&m, /* namespace= */ NULL) >= 0);
-        dummy_manager_init(m, NULL, 0);
+        dummy_manager_new(&m, NULL, 0);
 
         assert_se(stdout_stream_install(m, stream_fds[0], &stream) >= 0);
         fd0 = TAKE_FD(stream_fds[0]); /* avoid double close */
index 0bb4d5d56504cf7f38f3455447daf4d7fb2080a4..b94a249c986d01c139ea250bbb6b5a077ac2eff8 100644 (file)
@@ -5,35 +5,33 @@
 #include "alloc-util.h"
 #include "fuzz-journald.h"
 #include "journald-manager.h"
+#include "tests.h"
 
-void dummy_manager_init(Manager *m, const uint8_t *buffer, size_t size) {
-        assert(m);
+void dummy_manager_new(Manager **ret, const uint8_t *buffer, size_t size) {
+        _cleanup_(manager_freep) Manager *m = NULL;
+
+        assert(ret);
 
+        ASSERT_OK(manager_new(&m));
+        manager_merge_configs(m);
         m->config.storage = STORAGE_NONE;
-        assert_se(sd_event_default(&m->event) >= 0);
+        ASSERT_OK(sd_event_default(&m->event));
+
+        if (buffer)
+                ASSERT_NOT_NULL(m->buffer = memdup_suffix0(buffer, size));
 
-        if (buffer) {
-                m->buffer = memdup_suffix0(buffer, size);
-                assert_se(m->buffer);
-        }
+        *ret = TAKE_PTR(m);
 }
 
 void fuzz_journald_processing_function(
                 const uint8_t *data,
                 size_t size,
-                void (*f)(Manager *m, const char *buf, size_t raw_len, const struct ucred *ucred, const struct timeval *tv, const char *label, size_t label_len)
-        ) {
-
-        _cleanup_(manager_freep) Manager *m = NULL;
-        char *label = NULL;
-        size_t label_len = 0;
-        struct ucred *ucred = NULL;
-        struct timeval *tv = NULL;
+                journal_process_t f) {
 
         if (size == 0)
                 return;
 
-        assert_se(manager_new(&m, /* namespace= */ NULL) >= 0);
-        dummy_manager_init(m, data, size);
-        (*f)(m, m->buffer, size, ucred, tv, label, label_len);
+        _cleanup_(manager_freep) Manager *m = NULL;
+        dummy_manager_new(&m, data, size);
+        f(m, m->buffer, size, /* ucred = */ NULL, /* tv = */ NULL, /* label = */ NULL, /* label_len = */ 0);
 }
index 0d1ebce50a70a840f97199f99e6ff0805525d141..7eb491f36adf938344cd69bbfeb1d780cb7e41dd 100644 (file)
@@ -3,10 +3,18 @@
 
 #include "journald-manager.h"
 
-void dummy_manager_init(Manager *m, const uint8_t *buffer, size_t size);
+typedef void (*journal_process_t)(
+                Manager *m,
+                const char *buf,
+                size_t raw_len,
+                const struct ucred *ucred,
+                const struct timeval *tv,
+                const char *label,
+                size_t label_len);
+
+void dummy_manager_new(Manager **ret, const uint8_t *buffer, size_t size);
 
 void fuzz_journald_processing_function(
                 const uint8_t *data,
                 size_t size,
-                void (*f)(Manager *m, const char *buf, size_t raw_len, const struct ucred *ucred, const struct timeval *tv, const char *label, size_t label_len)
-);
+                journal_process_t f);
index cece07411f47771ac81854d7ebe57a6605fd5906..42245bf8d0d1cdf8446ac10ff3c8b8b1ab8959ff 100644 (file)
@@ -32,7 +32,7 @@ void journal_config_done(JournalConfig *c) {
         free(c->tty_path);
 }
 
-static void journal_config_set_defaults(JournalConfig *c) {
+void journal_config_set_defaults(JournalConfig *c) {
         assert(c);
 
         journal_config_done(c);
@@ -105,7 +105,7 @@ static void manager_merge_forward_to_socket(Manager *m) {
                 m->config_by_cred.name ?:                               \
                 default_value
 
-static void manager_merge_configs(Manager *m) {
+void manager_merge_configs(Manager *m) {
         assert(m);
 
         /* From highest to lowest priority: cmdline, conf, cred */
@@ -330,10 +330,6 @@ void manager_load_config(Manager *m) {
 
         assert(m);
 
-        journal_config_set_defaults(&m->config_by_conf);
-        journal_config_set_defaults(&m->config_by_cred);
-        journal_config_set_defaults(&m->config_by_cmdline);
-
         manager_load_credentials(&m->config_by_cred);
         manager_parse_config_file(m);
 
index 31077acba2dc452a86481b2567df036cf737410c..c396c3a56035e8a9ce9de6795c683739f3a6b919 100644 (file)
@@ -83,6 +83,8 @@ typedef struct JournalConfig {
 } JournalConfig;
 
 void journal_config_done(JournalConfig *c);
+void journal_config_set_defaults(JournalConfig *c);
+void manager_merge_configs(Manager *m);
 void manager_load_config(Manager *m);
 int manager_dispatch_reload_signal(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
 
index 727425225ff46aa2f8f5bc1e7502097c59d3ac77..b74dcfa7889976f42d62ebc41225c43a97935e1f 100644 (file)
@@ -2193,7 +2193,7 @@ static int manager_refresh_idle_timer(Manager *m) {
         return 1;
 }
 
-static int manager_set_namespace(Manager *m, const char *namespace) {
+int manager_set_namespace(Manager *m, const char *namespace) {
         assert(m);
 
         if (!namespace)
@@ -2288,9 +2288,8 @@ int manager_reload_journals(Manager *m) {
         return 0;
 }
 
-int manager_new(Manager **ret, const char *namespace) {
+int manager_new(Manager **ret) {
         _cleanup_(manager_freep) Manager *m = NULL;
-        int r;
 
         assert(ret);
 
@@ -2324,11 +2323,9 @@ int manager_new(Manager **ret, const char *namespace) {
                 .sigrtmin18_info.memory_pressure_userdata = m,
         };
 
-        r = manager_set_namespace(m, namespace);
-        if (r < 0)
-                return r;
-
-        manager_load_config(m);
+        journal_config_set_defaults(&m->config_by_conf);
+        journal_config_set_defaults(&m->config_by_cred);
+        journal_config_set_defaults(&m->config_by_cmdline);
 
         *ret = TAKE_PTR(m);
         return 0;
index 05a84bf8f18023674939005dafe251f3dcfdf413..a9ef3f394f8cec40226d65da3f5770e1db20a89b 100644 (file)
@@ -172,7 +172,8 @@ void manager_dispatch_message(Manager *m, struct iovec *iovec, size_t n, size_t
 void manager_driver_message_internal(Manager *m, pid_t object_pid, const char *format, ...) _sentinel_;
 #define manager_driver_message(...) manager_driver_message_internal(__VA_ARGS__, NULL)
 
-int manager_new(Manager **ret, const char *namespace);
+int manager_new(Manager **ret);
+int manager_set_namespace(Manager *m, const char *namespace);
 int manager_init(Manager *m);
 Manager* manager_free(Manager *m);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
index 393e90e1b5245e85697ea0bbf3323c2f16bfb6f9..e7ed6a556c93a4e1125df70dcf424aea656ef7a3 100644 (file)
@@ -52,10 +52,16 @@ static int run(int argc, char *argv[]) {
 
         sigbus_install();
 
-        r = manager_new(&m, namespace);
+        r = manager_new(&m);
         if (r < 0)
                 return log_oom();
 
+        r = manager_set_namespace(m, namespace);
+        if (r < 0)
+                return r;
+
+        manager_load_config(m);
+
         r = manager_init(m);
         if (r < 0)
                 return r;