]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: test journalctl with corrupted journals 27458/head
authorFrantisek Sumsal <frantisek@sumsal.cz>
Sat, 29 Apr 2023 10:01:37 +0000 (12:01 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Mon, 1 May 2023 08:14:12 +0000 (10:14 +0200)
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.

test/test-journals/afl-corrupted-journals.tar.zst [new file with mode: 0644]
test/units/testsuite-04.sh

diff --git a/test/test-journals/afl-corrupted-journals.tar.zst b/test/test-journals/afl-corrupted-journals.tar.zst
new file mode 100644 (file)
index 0000000..8c2d92d
Binary files /dev/null and b/test/test-journals/afl-corrupted-journals.tar.zst differ
index 8bab2bf9f1532b0681bd84ad9cc4532101531b8d..3a7c0347ae4ec65780f47995701334a732150270 100755 (executable)
@@ -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