From b635e4ef6b2f35f07111bb66a68fe850a2ccab72 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 11:10:06 +0100 Subject: [PATCH 01/16] travis: use xenial instead of trusty This should also fix an issue mentioned in https://github.com/systemd/systemd/pull/11196#issuecomment-448123946. --- .travis.yml | 1 + travis-ci/managers/debian.sh | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f50731fe3f..56beeeb84d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ sudo: required +dist: xenial services: - docker diff --git a/travis-ci/managers/debian.sh b/travis-ci/managers/debian.sh index af2f0dab08..976e926c82 100755 --- a/travis-ci/managers/debian.sh +++ b/travis-ci/managers/debian.sh @@ -39,9 +39,6 @@ for phase in "${PHASES[@]}"; do $DOCKER_EXEC apt-get -y update $DOCKER_EXEC apt-get -y build-dep systemd $DOCKER_EXEC apt-get -y install "${ADDITIONAL_DEPS[@]}" - # overlayfs on TravisCI is having trouble delivering inotify events to test-path and test-event. - # Let's use tmpfs instead for now. - $DOCKER_EXEC mount -t tmpfs tmpfs /tmp ;; RUN) info "Run phase" From f9cf34914708c066272bf1a5924d8aa5e1622352 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 12:04:20 +0100 Subject: [PATCH 02/16] travis: skip test-bpf on Travis CI More generally IPAddress[Allow|Deny] are broken in docker and lxc containers. --- src/test/test-bpf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/test-bpf.c b/src/test/test-bpf.c index ea5f0f5bc6..7341f7f1ea 100644 --- a/src/test/test-bpf.c +++ b/src/test/test-bpf.c @@ -30,6 +30,9 @@ int main(int argc, char *argv[]) { test_setup_logging(LOG_DEBUG); + if (is_run_on_travis_ci()) + return log_tests_skipped("test-bpf fails on Travis CI: https://github.com/systemd/systemd/issues/9666"); + r = enter_cgroup_subroot(); if (r == -ENOMEDIUM) return log_tests_skipped("cgroupfs not available"); From 749d3c938f2f7400c3192e40e0a656fd2cf87f83 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 13:01:41 +0100 Subject: [PATCH 03/16] travis: switch to Debian Testing Turns out Fedora is the least stable distribution in terms of downloading packages. Debian is much more stable so let's use it. --- .travis.yml | 130 ++++++++++++++++++++++------------------------------ 1 file changed, 56 insertions(+), 74 deletions(-) diff --git a/.travis.yml b/.travis.yml index 56beeeb84d..ab6fe298c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,80 +18,7 @@ stages: jobs: include: - stage: Build & test - name: Fedora Latest - language: bash - env: - - FEDORA_RELEASE="latest" - - CONT_NAME="systemd-fedora-$FEDORA_RELEASE" - - DOCKER_EXEC="docker exec -ti $CONT_NAME" - before_install: - - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - - docker --version - install: - - $CI_MANAGERS/fedora.sh SETUP - script: - - set -e - # Build systemd - - $CI_MANAGERS/fedora.sh RUN - - set +e - after_script: - - $CI_MANAGERS/fedora.sh CLEANUP - - - name: Fedora Latest (ASan+UBSan) - language: bash - env: - - FEDORA_RELEASE="latest" - - CONT_NAME="systemd-fedora-$FEDORA_RELEASE" - - DOCKER_EXEC="docker exec -ti $CONT_NAME" - before_install: - - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - - docker --version - install: - - $CI_MANAGERS/fedora.sh SETUP - script: - - set -e - - $CI_MANAGERS/fedora.sh RUN_ASAN - - set +e - after_script: - - $CI_MANAGERS/fedora.sh CLEANUP - - - name: Fedora Latest (clang) - language: bash - env: - - FEDORA_RELEASE="latest" - - CONT_NAME="systemd-fedora-$FEDORA_RELEASE" - - DOCKER_EXEC="docker exec -ti $CONT_NAME" - before_install: - - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - - docker --version - install: - - $CI_MANAGERS/fedora.sh SETUP - script: - - set -e - - $CI_MANAGERS/fedora.sh RUN_CLANG - - set +e - after_script: - - $CI_MANAGERS/fedora.sh CLEANUP - - - name: Fedora Latest (clang ASan+UBSan) - language: bash - env: - - FEDORA_RELEASE="latest" - - CONT_NAME="systemd-fedora-$FEDORA_RELEASE" - - DOCKER_EXEC="docker exec -ti $CONT_NAME" - before_install: - - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - - docker --version - install: - - $CI_MANAGERS/fedora.sh SETUP - script: - - set -e - - $CI_MANAGERS/fedora.sh RUN_CLANG_ASAN - - set +e - after_script: - - $CI_MANAGERS/fedora.sh CLEANUP - - - name: Debian Testing + name: Debian Testing language: bash env: - DEBIAN_RELEASE="testing" @@ -104,11 +31,66 @@ jobs: - $CI_MANAGERS/debian.sh SETUP script: - set -e + # Build systemd - $CI_MANAGERS/debian.sh RUN - set +e after_script: - $CI_MANAGERS/debian.sh CLEANUP + - name: Debian Testing (ASan+UBSan) + language: bash + env: + - DEBIAN_RELEASE="testing" + - CONT_NAME="systemd-debian-$DEBIAN_RELEASE" + - DOCKER_EXEC="docker exec -ti $CONT_NAME" + before_install: + - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce + - docker --version + install: + - $CI_MANAGERS/debian.sh SETUP + script: + - set -e + - $CI_MANAGERS/debian.sh RUN_ASAN + - set +e + after_script: + - $CI_MANAGERS/debian.sh CLEANUP + + - name: Debian Testing (clang) + language: bash + env: + - DEBIAN_RELEASE="testing" + - CONT_NAME="systemd-debian-$DEBIAN_RELEASE" + - DOCKER_EXEC="docker exec -ti $CONT_NAME" + before_install: + - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce + - docker --version + install: + - $CI_MANAGERS/debian.sh SETUP + script: + - set -e + - $CI_MANAGERS/debian.sh RUN_CLANG + - set +e + after_script: + - $CI_MANAGERS/debian.sh CLEANUP + + - name: Debian Testing (clang ASan+UBSan) + language: bash + env: + - DEBIAN_RELEASE="testing" + - CONT_NAME="systemd-debian-$DEBIAN_RELEASE" + - DOCKER_EXEC="docker exec -ti $CONT_NAME" + before_install: + - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce + - docker --version + install: + - $CI_MANAGERS/debian.sh SETUP + script: + - set -e + - $CI_MANAGERS/debian.sh RUN_CLANG_ASAN + - set +e + after_script: + - $CI_MANAGERS/debian.sh CLEANUP + - stage: Coverity language: bash env: From 17662042791071f1bc7b66ab328047bae6137105 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 13:31:14 +0100 Subject: [PATCH 04/16] travis: add another stage to really run everything under ASan+UBsan This should help to catch issues like https://github.com/systemd/systemd/issues/11253 and https://github.com/systemd/systemd/issues/11251. --- .travis.yml | 7 +++++++ travis-ci/managers/xenial.sh | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100755 travis-ci/managers/xenial.sh diff --git a/.travis.yml b/.travis.yml index ab6fe298c7..6eae0bc3e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,6 +91,13 @@ jobs: after_script: - $CI_MANAGERS/debian.sh CLEANUP + - name: Ubuntu Xenial + language: bash + script: + - set -e + - sudo $CI_MANAGERS/xenial.sh + - set +e + - stage: Coverity language: bash env: diff --git a/travis-ci/managers/xenial.sh b/travis-ci/managers/xenial.sh new file mode 100755 index 0000000000..06e3c0a230 --- /dev/null +++ b/travis-ci/managers/xenial.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e +set -x + +add-apt-repository ppa:pitti/systemd-semaphore -y +apt-get update +apt-get build-dep systemd -y +apt-get install -y util-linux libmount-dev libblkid-dev liblzma-dev libqrencode-dev libmicrohttpd-dev iptables-dev liblz4-dev libcurl4-gnutls-dev unifont itstool kbd cryptsetup-bin net-tools isc-dhcp-client iputils-ping strace qemu-system-x86 linux-image-virtual mount libgpg-error-dev libxkbcommon-dev python-lxml python3-lxml python3-pip libcap-dev +apt-get install -y gettext python3-evdev python3-pyparsing libmount-dev python3-setuptools ninja-build +pip3 install meson + +cd $REPO_ROOT + +sed -i 's/2\.30/2.27/' meson.build + +meson --werror -Db_sanitize=address,undefined -Dsplit-usr=true build +ninja -v -C build +make -C test/TEST-01-BASIC clean setup run TEST_NO_QEMU=yes NSPAWN_ARGUMENTS=--keep-unit From b4a450d85fac8fd738f8f20989a38d522072369f Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 14:12:20 +0100 Subject: [PATCH 05/16] tests: use systemd-journald to check whether everything has been built with ASan --- test/test-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test-functions b/test/test-functions index 37069396b7..169ecdbf13 100644 --- a/test/test-functions +++ b/test/test-functions @@ -37,7 +37,7 @@ is_built_with_asan() { fi # Borrowed from https://github.com/google/oss-fuzz/blob/cd9acd02f9d3f6e80011cc1e9549be526ce5f270/infra/base-images/base-runner/bad_build_check#L182 - local _asan_calls=$(objdump -dC $BUILD_DIR/systemd | egrep "callq\s+[0-9a-f]+\s+<__asan" -c) + local _asan_calls=$(objdump -dC $BUILD_DIR/systemd-journald | egrep "callq\s+[0-9a-f]+\s+<__asan" -c) if (( $_asan_calls < 1000 )); then return 1 else From 9103671d7c2af8ff613b0eaefbb4931ea8021aee Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 14:28:01 +0100 Subject: [PATCH 06/16] test: don't run TEST-01-BASIC in unprivileged containers on Travis CI --- test/TEST-01-BASIC/test.sh | 2 +- travis-ci/managers/xenial.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh index 1d2f833478..d74a2e00c1 100755 --- a/test/TEST-01-BASIC/test.sh +++ b/test/TEST-01-BASIC/test.sh @@ -3,7 +3,7 @@ # ex: ts=8 sw=4 sts=4 et filetype=sh set -e TEST_DESCRIPTION="Basic systemd setup" -RUN_IN_UNPRIVILEGED_CONTAINER=yes +RUN_IN_UNPRIVILEGED_CONTAINER=${RUN_IN_UNPRIVILEGED_CONTAINER:-yes} . $TEST_BASE_DIR/test-functions diff --git a/travis-ci/managers/xenial.sh b/travis-ci/managers/xenial.sh index 06e3c0a230..c854e681b0 100755 --- a/travis-ci/managers/xenial.sh +++ b/travis-ci/managers/xenial.sh @@ -16,4 +16,4 @@ sed -i 's/2\.30/2.27/' meson.build meson --werror -Db_sanitize=address,undefined -Dsplit-usr=true build ninja -v -C build -make -C test/TEST-01-BASIC clean setup run TEST_NO_QEMU=yes NSPAWN_ARGUMENTS=--keep-unit +make -C test/TEST-01-BASIC clean setup run TEST_NO_QEMU=yes NSPAWN_ARGUMENTS=--keep-unit RUN_IN_UNPRIVILEGED_CONTAINER=no From 7e11a95e41750381e4c0a539f83b5602f72074ed Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 14:46:00 +0100 Subject: [PATCH 07/16] tests: reproduce https://github.com/systemd/systemd/issues/11251 --- src/core/main.c | 8 ++++++++ test/TEST-01-BASIC/test.sh | 2 +- test/test-functions | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/core/main.c b/src/core/main.c index 839dc062ff..d4b19c9fff 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -83,6 +83,10 @@ #include "virt.h" #include "watchdog.h" +#if HAS_FEATURE_ADDRESS_SANITIZER +#include +#endif + static enum { ACTION_RUN, ACTION_HELP, @@ -2612,6 +2616,10 @@ finish: } #endif +#if HAS_FEATURE_ADDRESS_SANITIZER + __lsan_do_leak_check(); +#endif + if (shutdown_verb) { r = become_shutdown(shutdown_verb, retval); log_error_errno(r, "Failed to execute shutdown binary, %s: %m", getpid_cached() == 1 ? "freezing" : "quitting"); diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh index d74a2e00c1..7aa21ff999 100755 --- a/test/TEST-01-BASIC/test.sh +++ b/test/TEST-01-BASIC/test.sh @@ -26,7 +26,7 @@ Description=Testsuite service After=multi-user.target [Service] -ExecStart=/bin/sh -x -c 'systemctl --state=failed --no-legend --no-pager > /failed ; echo OK > /testok' +ExecStart=/bin/sh -x -c 'systemctl --state=failed --no-legend --no-pager > /failed ; systemctl daemon-reload ; echo OK > /testok' Type=oneshot EOF diff --git a/test/test-functions b/test/test-functions index 169ecdbf13..9aa99140cd 100644 --- a/test/test-functions +++ b/test/test-functions @@ -462,6 +462,14 @@ check_result_nspawn() { ls -l $TESTDIR/journal/*/*.journal test -s $TESTDIR/failed && ret=$(($ret+1)) [ -n "$TIMED_OUT" ] && ret=$(($ret+1)) + if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then + ls -l "$TESTDIR/$1" + if [[ -e "$TESTDIR/$1/systemd.asan.log.1" ]]; then + cat "$TESTDIR/$1/systemd.asan.log.1" + ret=$(($ret+1)) + fi + fi + return $ret } From 998445fd8a5357f51dfd9e68548c5c5b862a273c Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 15:30:41 +0100 Subject: [PATCH 08/16] tests: fail if asan has found issues in journald --- test/test-functions | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/test-functions b/test/test-functions index 9aa99140cd..350cb4ff21 100644 --- a/test/test-functions +++ b/test/test-functions @@ -455,6 +455,7 @@ EOF check_result_nspawn() { local ret=1 + local journald_report="" [[ -e $TESTDIR/$1/testok ]] && ret=0 [[ -f $TESTDIR/$1/failed ]] && cp -a $TESTDIR/$1/failed $TESTDIR cp -a $TESTDIR/$1/var/log/journal $TESTDIR @@ -468,6 +469,12 @@ check_result_nspawn() { cat "$TESTDIR/$1/systemd.asan.log.1" ret=$(($ret+1)) fi + + journald_report=$(find "$TESTDIR/$1" -name "systemd-journald.asan.log*" -exec cat {} \;) + if [[ ! -z "$journald_report" ]]; then + printf "%s" "$journald_report" + ret=$(($ret+1)) + fi fi return $ret From ef30f7cac18a810814ada7e6a68a31d48cc9fccd Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Mon, 24 Dec 2018 00:29:56 +0100 Subject: [PATCH 09/16] journal: rely on _cleanup_free_ to free a temporary string used in client_context_read_cgroup Closes https://github.com/systemd/systemd/issues/11253. --- src/journal/journald-context.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/journal/journald-context.c b/src/journal/journald-context.c index 8253a45128..2d711bc824 100644 --- a/src/journal/journald-context.c +++ b/src/journal/journald-context.c @@ -246,7 +246,7 @@ static int client_context_read_label( } static int client_context_read_cgroup(Server *s, ClientContext *c, const char *unit_id) { - char *t = NULL; + _cleanup_free_ char *t = NULL; int r; assert(c); @@ -254,7 +254,6 @@ static int client_context_read_cgroup(Server *s, ClientContext *c, const char *u /* Try to acquire the current cgroup path */ r = cg_pid_get_path_shifted(c->pid, s->cgroup_root, &t); if (r < 0 || empty_or_root(t)) { - /* We use the unit ID passed in as fallback if we have nothing cached yet and cg_pid_get_path_shifted() * failed or process is running in a root cgroup. Zombie processes are automatically migrated to root cgroup * on cgroupsv1 and we want to be able to map log messages from them too. */ @@ -268,10 +267,8 @@ static int client_context_read_cgroup(Server *s, ClientContext *c, const char *u } /* Let's shortcut this if the cgroup path didn't change */ - if (streq_ptr(c->cgroup, t)) { - free(t); + if (streq_ptr(c->cgroup, t)) return 0; - } free_and_replace(c->cgroup, t); From 082bcdca2cff8e421e7207ad20ab3aa931ba2833 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Mon, 24 Dec 2018 01:15:43 +0100 Subject: [PATCH 10/16] tests: overwrite a hard-coded timeout in systemd-hwdb-update.service --- test/test-functions | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test-functions b/test/test-functions index 350cb4ff21..bda62e9f7f 100644 --- a/test/test-functions +++ b/test/test-functions @@ -354,6 +354,11 @@ JOURNALD_CONF_DIR=/etc/systemd/system/systemd-journald.service.d mkdir -p "\$JOURNALD_CONF_DIR" printf "[Service]\nEnvironment=ASAN_OPTIONS=\$DEFAULT_ASAN_OPTIONS:log_path=/systemd-journald.asan.log\n" >"\$JOURNALD_CONF_DIR/env.conf" +# 90s isn't enough for some services to finish when literally everything is run +# under ASan+UBSan in containers, which, in turn, are run in VMs. +mkdir -p /etc/systemd/system/systemd-hwdb-update.service.d +printf "[Service]\nTimeoutSec=180s\n" >/etc/systemd/system/systemd-hwdb-update.service.d/timeout.conf + export ASAN_OPTIONS=\$DEFAULT_ASAN_OPTIONS:log_path=/systemd.asan.log UBSAN_OPTIONS=\$DEFAULT_UBSAN_OPTIONS exec $ROOTLIBDIR/systemd "\$@" EOF From 8934737154a7d8a6f9809ac33f634f5b80443bd9 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Mon, 24 Dec 2018 04:03:40 +0100 Subject: [PATCH 11/16] travis: merge RUN_CLANG into RUN They are basically the same except that a couple of environment variables have to be passed for building systemd with clang. --- travis-ci/managers/debian.sh | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/travis-ci/managers/debian.sh b/travis-ci/managers/debian.sh index 976e926c82..587049bfa7 100755 --- a/travis-ci/managers/debian.sh +++ b/travis-ci/managers/debian.sh @@ -40,18 +40,15 @@ for phase in "${PHASES[@]}"; do $DOCKER_EXEC apt-get -y build-dep systemd $DOCKER_EXEC apt-get -y install "${ADDITIONAL_DEPS[@]}" ;; - RUN) - info "Run phase" - $DOCKER_EXEC meson --werror -Dtests=unsafe -Dslow-tests=true -Dsplit-usr=true build + RUN|RUN_CLANG) + if [[ "$phase" = "RUN_CLANG" ]]; then + ENV_VARS="-e CC=clang -e CXX=clang++" + fi + docker exec $ENV_VARS -it $CONT_NAME meson --werror -Dtests=unsafe -Dslow-tests=true -Dsplit-usr=true build $DOCKER_EXEC ninja -v -C build $DOCKER_EXEC ninja -C build test $DOCKER_EXEC tools/check-directives.sh ;; - RUN_CLANG) - docker exec -e CC=clang -e CXX=clang++ -it $CONT_NAME meson --werror -Dtests=unsafe -Dslow-tests=true -Dsplit-usr=true build - $DOCKER_EXEC ninja -v -C build - $DOCKER_EXEC ninja -C build test - ;; RUN_ASAN|RUN_CLANG_ASAN) if [[ "$phase" = "RUN_CLANG_ASAN" ]]; then ENV_VARS="-e CC=clang -e CXX=clang++" From c47bfb198a6132d5e0a2d90ea7ce8855fd793760 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Mon, 24 Dec 2018 04:44:47 +0100 Subject: [PATCH 12/16] travis: pass $TRAVIS when running the tests so that they can be skipped properly --- travis-ci/managers/debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis-ci/managers/debian.sh b/travis-ci/managers/debian.sh index 587049bfa7..dbd12c4759 100755 --- a/travis-ci/managers/debian.sh +++ b/travis-ci/managers/debian.sh @@ -46,7 +46,7 @@ for phase in "${PHASES[@]}"; do fi docker exec $ENV_VARS -it $CONT_NAME meson --werror -Dtests=unsafe -Dslow-tests=true -Dsplit-usr=true build $DOCKER_EXEC ninja -v -C build - $DOCKER_EXEC ninja -C build test + docker exec -e "TRAVIS=$TRAVIS" -it $CONT_NAME ninja -C build test $DOCKER_EXEC tools/check-directives.sh ;; RUN_ASAN|RUN_CLANG_ASAN) From 71cf890bccac7ed0fbe0d58fc88a16df17eaf904 Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Tue, 25 Dec 2018 05:56:46 +0100 Subject: [PATCH 13/16] travis: also run TEST-01-BASIC with QEMU to cover udevd and so on --- travis-ci/managers/xenial.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/travis-ci/managers/xenial.sh b/travis-ci/managers/xenial.sh index c854e681b0..10ba4382f8 100755 --- a/travis-ci/managers/xenial.sh +++ b/travis-ci/managers/xenial.sh @@ -17,3 +17,8 @@ sed -i 's/2\.30/2.27/' meson.build meson --werror -Db_sanitize=address,undefined -Dsplit-usr=true build ninja -v -C build make -C test/TEST-01-BASIC clean setup run TEST_NO_QEMU=yes NSPAWN_ARGUMENTS=--keep-unit RUN_IN_UNPRIVILEGED_CONTAINER=no + +# Now that we're more or less sure that ASan isn't going to crash systemd and cause a kernel panic +# let's also run the test with QEMU to cover udevd, sysctl and everything else that isn't run +# in containers. +make -C test/TEST-01-BASIC clean setup run TEST_NO_NSPAWN=yes From 9688fccc27ba3526c3069a967221af125ce39f9a Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Tue, 25 Dec 2018 06:13:45 +0100 Subject: [PATCH 14/16] tests: double DefaultTimeoutStartSec when systemd is run under ASan+UBSan --- test/test-functions | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test-functions b/test/test-functions index bda62e9f7f..467dbbd8e9 100644 --- a/test/test-functions +++ b/test/test-functions @@ -344,6 +344,7 @@ if [[ "\$PATH_TO_ASAN" ]]; then DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=\$PATH_TO_ASAN" fi echo DefaultEnvironment=\$DEFAULT_ENVIRONMENT >>/etc/systemd/system.conf +echo DefaultTimeoutStartSec=180s >>/etc/systemd/system.conf # ASAN and syscall filters aren't compatible with each other. find / -name '*.service' -type f | xargs sed -i 's/^\\(MemoryDeny\\|SystemCall\\)/#\\1/' From ed4f303f398a09986233364ce4fba6a6cdabf31b Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Sun, 23 Dec 2018 15:48:18 +0100 Subject: [PATCH 15/16] tests: look for ASan+UBSan reports in the journal --- test/test-functions | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/test-functions b/test/test-functions index 467dbbd8e9..dd9cdb7de1 100644 --- a/test/test-functions +++ b/test/test-functions @@ -462,6 +462,7 @@ EOF check_result_nspawn() { local ret=1 local journald_report="" + local pids="" [[ -e $TESTDIR/$1/testok ]] && ret=0 [[ -f $TESTDIR/$1/failed ]] && cp -a $TESTDIR/$1/failed $TESTDIR cp -a $TESTDIR/$1/var/log/journal $TESTDIR @@ -481,6 +482,14 @@ check_result_nspawn() { printf "%s" "$journald_report" ret=$(($ret+1)) fi + + pids=$("$BUILD_DIR/journalctl" -D "$TESTDIR/$1/var/log/journal" | perl -alne 'print $1 if /\[(\d+)\]:\s*SUMMARY:\s+\w+Sanitizer/') + if [[ ! -z "$pids" ]]; then + ret=$(($ret+1)) + for pid in $pids; do + "$BUILD_DIR/journalctl" -D "$TESTDIR/$1/var/log/journal" _PID=$pid --no-pager + done + fi fi return $ret From 0d6e61d6a1c325fb01c3a1a871b71514bbe6283a Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin Date: Tue, 25 Dec 2018 08:31:50 +0100 Subject: [PATCH 16/16] tests: introduce check_asan_reports and use it in check_result_{qemu|nspawn} --- test/test-functions | 53 ++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/test/test-functions b/test/test-functions index dd9cdb7de1..80467b526e 100644 --- a/test/test-functions +++ b/test/test-functions @@ -459,6 +459,35 @@ EOF fi } +check_asan_reports() { + local ret=0 + local root="$1" + + if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then + ls -l "$root" + if [[ -e "$root/systemd.asan.log.1" ]]; then + cat "$root/systemd.asan.log.1" + ret=$(($ret+1)) + fi + + journald_report=$(find "$root" -name "systemd-journald.asan.log*" -exec cat {} \;) + if [[ ! -z "$journald_report" ]]; then + printf "%s" "$journald_report" + ret=$(($ret+1)) + fi + + pids=$("$BUILD_DIR/journalctl" -D "$root/var/log/journal" | perl -alne 'print $1 if /\[(\d+)\]:\s*SUMMARY:\s+\w+Sanitizer/') + if [[ ! -z "$pids" ]]; then + ret=$(($ret+1)) + for pid in $pids; do + "$BUILD_DIR/journalctl" -D "$root/var/log/journal" _PID=$pid --no-pager + done + fi + fi + + return $ret +} + check_result_nspawn() { local ret=1 local journald_report="" @@ -470,28 +499,7 @@ check_result_nspawn() { ls -l $TESTDIR/journal/*/*.journal test -s $TESTDIR/failed && ret=$(($ret+1)) [ -n "$TIMED_OUT" ] && ret=$(($ret+1)) - if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then - ls -l "$TESTDIR/$1" - if [[ -e "$TESTDIR/$1/systemd.asan.log.1" ]]; then - cat "$TESTDIR/$1/systemd.asan.log.1" - ret=$(($ret+1)) - fi - - journald_report=$(find "$TESTDIR/$1" -name "systemd-journald.asan.log*" -exec cat {} \;) - if [[ ! -z "$journald_report" ]]; then - printf "%s" "$journald_report" - ret=$(($ret+1)) - fi - - pids=$("$BUILD_DIR/journalctl" -D "$TESTDIR/$1/var/log/journal" | perl -alne 'print $1 if /\[(\d+)\]:\s*SUMMARY:\s+\w+Sanitizer/') - if [[ ! -z "$pids" ]]; then - ret=$(($ret+1)) - for pid in $pids; do - "$BUILD_DIR/journalctl" -D "$TESTDIR/$1/var/log/journal" _PID=$pid --no-pager - done - fi - fi - + check_asan_reports "$TESTDIR/$1" || ret=$(($ret+1)) return $ret } @@ -503,6 +511,7 @@ check_result_qemu() { [[ -e $TESTDIR/root/testok ]] && ret=0 [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR cp -a $TESTDIR/root/var/log/journal $TESTDIR + check_asan_reports "$TESTDIR/root" || ret=$(($ret+1)) umount $TESTDIR/root [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed ls -l $TESTDIR/journal/*/*.journal