From: Frantisek Sumsal Date: Sat, 29 Apr 2023 10:01:37 +0000 (+0200) Subject: test: test journalctl with corrupted journals X-Git-Tag: v254-rc1~586^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F27458%2Fhead;p=thirdparty%2Fsystemd.git test: test journalctl with corrupted journals Last month I monkey-patched journald to produce a small (64K) but valid journal and used that as an input to four AFL fuzzers. After a month it generated quite a nice corpora (4738 test cases) and after filtering and minimizing it I was left with 619 unique journals with various levels of corruption that probe the journal code. It seems to detect past issues like systemd#26567, etc. --- diff --git a/test/test-journals/afl-corrupted-journals.tar.zst b/test/test-journals/afl-corrupted-journals.tar.zst new file mode 100644 index 00000000000..8c2d92d3ae0 Binary files /dev/null and b/test/test-journals/afl-corrupted-journals.tar.zst differ diff --git a/test/units/testsuite-04.sh b/test/units/testsuite-04.sh index 8bab2bf9f15..3a7c0347ae4 100755 --- a/test/units/testsuite-04.sh +++ b/test/units/testsuite-04.sh @@ -318,4 +318,39 @@ systemctl daemon-reload systemctl restart systemd-journald.service journalctl --rotate +# Corrupted journals +JOURNAL_DIR="$(mktemp -d)" +REMOTE_OUT="$(mktemp -d)" +# tar on C8S doesn't support the --zstd option +unzstd --stdout "/test-journals/afl-corrupted-journals.tar.zst" | tar -xC "$JOURNAL_DIR/" +# First, try each of them sequentially. Skip this part when running with plain +# QEMU, as it is excruciatingly slow +# Note: we care only about exit code 124 (timeout) and special bash exit codes +# >124 (like signals) +if [[ "$(systemd-detect-virt -v)" != "qemu" ]]; then + while read -r file; do + timeout 10 journalctl -b --file="$file" >/dev/null || [[ $? -lt 124 ]] + timeout 10 journalctl -o export --file="$file" >/dev/null || [[ $? -lt 124 ]] + if [[ -x /usr/lib/systemd/systemd-journal-remote ]]; then + timeout 10 /usr/lib/systemd/systemd-journal-remote \ + --getter="journalctl -o export --file=$file" \ + --split-mode=none \ + --output="$REMOTE_OUT/system.journal" || [[ $? -lt 124 ]] + timeout 10 journalctl -b --directory="$REMOTE_OUT" >/dev/null || [[ $? -lt 124 ]] + rm -f "$REMOTE_OUT"/* + fi + done < <(find "$JOURNAL_DIR" -type f) +fi +# And now all at once +timeout 30 journalctl -b --directory="$JOURNAL_DIR" >/dev/null || [[ $? -lt 124 ]] +timeout 30 journalctl -o export --directory="$JOURNAL_DIR" >/dev/null || [[ $? -lt 124 ]] +if [[ -x /usr/lib/systemd/systemd-journal-remote ]]; then + timeout 30 /usr/lib/systemd/systemd-journal-remote \ + --getter="journalctl -o export --directory=$JOURNAL_DIR" \ + --split-mode=none \ + --output="$REMOTE_OUT/system.journal" || [[ $? -lt 124 ]] + timeout 10 journalctl -b --directory="$REMOTE_OUT" >/dev/null || [[ $? -lt 124 ]] + rm -f "$REMOTE_OUT"/* +fi + touch /testok