1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
7 #include "sd-journal.h"
13 #include "journal-remote.h"
14 #include "logs-show.h"
15 #include "memfd-util.h"
18 int LLVMFuzzerTestOneInput(const uint8_t *data
, size_t size
) {
21 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/fuzz-journal-remote.XXXXXX.journal";
22 _cleanup_close_
int fdout
= -1;
23 _cleanup_(sd_journal_closep
) sd_journal
*j
= NULL
;
24 _cleanup_(journal_remote_server_destroy
) RemoteServer s
= {};
27 if (outside_size_range(size
, 3, 65536))
30 if (!getenv("SYSTEMD_LOG_LEVEL"))
31 log_set_max_level(LOG_ERR
);
33 fdin
= memfd_new_and_map("fuzz-journal-remote", size
, &mem
);
35 return log_error_errno(fdin
, "memfd_new_and_map() failed: %m");
37 memcpy(mem
, data
, size
);
38 assert_se(munmap(mem
, size
) == 0);
40 fdout
= mkostemps(name
, STRLEN(".journal"), O_CLOEXEC
);
42 return log_error_errno(errno
, "mkostemps() failed: %m");
46 r
= journal_remote_server_init(&s
, name
, JOURNAL_WRITE_SPLIT_NONE
, 0);
48 assert_se(IN_SET(r
, -ENOMEM
, -EMFILE
, -ENFILE
));
52 r
= journal_remote_add_source(&s
, fdin
, (char*) "fuzz-data", false);
60 assert_se(journal_remote_handle_raw_source(NULL
, fdin
, 0, &s
) >= 0);
62 assert_se(close(fdin
) < 0 && errno
== EBADF
); /* Check that the fd is closed already */
66 r
= sd_journal_open_files(&j
, (const char**) STRV_MAKE(name
), 0);
68 log_error_errno(r
, "sd_journal_open_files([\"%s\"]) failed: %m", name
);
69 assert_se(IN_SET(r
, -ENOMEM
, -EMFILE
, -ENFILE
, -ENODATA
));
73 _cleanup_fclose_
FILE *dev_null
= NULL
;
74 if (getenv_bool("SYSTEMD_FUZZ_OUTPUT") <= 0) {
75 dev_null
= fopen("/dev/null", "we");
77 return log_error_errno(errno
, "fopen(\"/dev/null\") failed: %m");
80 for (OutputMode mode
= 0; mode
< _OUTPUT_MODE_MAX
; mode
++) {
82 log_info("/* %s */", output_mode_to_string(mode
));
83 r
= show_journal(dev_null
?: stdout
, j
, mode
, 0, 0, -1, 0, NULL
);
86 r
= sd_journal_seek_head(j
);