From 75037db319f9eb240d73186eee457f62d4b16c7d Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Tue, 14 Jun 2022 22:54:39 +0200 Subject: [PATCH] test: wrap binaries using systemd DSOs when running w/ ASan Let's detect & wrap binaries which are linked against systemd DSOs and we're running under ASan, since otherwise running such binaries ends with: ``` ==633==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD. ``` (cherry picked from commit 3917534d620c2b358a196431b9e2593218ba1ac9) Related: #2087652 --- test/test-functions | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/test/test-functions b/test/test-functions index a0ad8b2fb1..34aeac339f 100644 --- a/test/test-functions +++ b/test/test-functions @@ -2426,6 +2426,9 @@ inst_binary() { local file line local so_regex='([^ ]*/lib[^/]*/[^ ]*\.so[^ ]*)' + # DSOs provided by systemd + local systemd_so_regex='/(libudev|libsystemd.*|.+[\-_]systemd([\-_].+)?|libnss_(mymachines|myhostname|resolve)).so' + local wrap_binary=0 # I love bash! while read -r line; do [[ "$line" = 'not a dynamic executable' ]] && break @@ -2434,6 +2437,12 @@ inst_binary() { # by ldd attempting to use the unprefixed RPATH. [[ "$line" =~ libsystemd.*\ not\ found ]] && continue + # We're built with ASan and the target binary loads one of the systemd's + # DSOs, so we need to tweak the environment before executing the binary + if get_bool "$IS_BUILT_WITH_ASAN" && [[ "$line" =~ $systemd_so_regex ]]; then + wrap_binary=1 + fi + if [[ "$line" =~ $so_regex ]]; then file="${BASH_REMATCH[1]}" [[ -e "${initdir}/$file" ]] && continue @@ -2449,7 +2458,36 @@ inst_binary() { exit 1 fi done < <(LC_ALL=C ldd "$bin" 2>/dev/null) - inst_simple "$bin" "$target" + + # Same as above, but we need to wrap certain libraries unconditionally + # + # login - dlopen()s (not only) systemd's PAM modules + # tar - called by machinectl in TEST-25 + if get_bool "$IS_BUILT_WITH_ASAN" && [[ "$bin" =~ /(login|tar)$ ]]; then + wrap_binary=1 + fi + + if get_bool "$wrap_binary"; then + dinfo "Creating ASan-compatible wrapper for binary '$target'" + # Install the target binary with a ".orig" suffix + inst_simple "$bin" "${target}.orig" + # Create a simple shell wrapper in place of the target binary, which + # sets necessary ASan-related env variables and then exec()s the + # suffixed target binary + cat >"$initdir/$target" <