From b5c0fcdadeed8803addf8d2aec6142fb9d8a5660 Mon Sep 17 00:00:00 2001 From: Andrew Haberlandt Date: Thu, 20 Nov 2025 10:40:13 -0800 Subject: [sanitizer_common] posix_spawn test should forward DYLD_LIBRARY_PATH (#168795) This test explicitly sets the environment for a spawned process. Without DYLD_LIBRARY_PATH, the spawned process may use a ASAN runtime other than the one that was used by the parent process That other runtime library may not work at all, or may not be in the default search path. Either case can cause the spawned process to die before it makes it to main, thus failing the test. The compiler-rt lit config sets the library path variable [here](https://github.com/llvm/llvm-project/blob/main/compiler-rt/test/lit.common.cfg.py#L84) (i.e. to ensure that just-built runtimes are used for tests, in the case of a standalone compiler-rt build), and that is currently used by the parent process but not the spawned ones. My change only forwards the variable for Darwin (DYLD_LIBRARY_PATH), but we **_ought_** to also forward the variable for other platforms. However, it's not clear that there's any good way to plumb this into the test, since some platforms actually have multiple library path variables which would need to be forwarded (see: SunOS [here](https://github.com/llvm/llvm-project/blob/main/compiler-rt/test/lit.common.cfg.py#L102)). I considered adding a substitution variable for the library path variable, but that doesn't really work if there's multiple such variables. --- .../test/sanitizer_common/TestCases/Posix/posix_spawn.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'compiler-rt') diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c b/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c index ea58b92af609..1a66a6166dd1 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c +++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c @@ -6,8 +6,12 @@ #include #include #include +#include +#include #include +extern char **environ; + int main(int argc, char **argv) { if (argc > 1) { // CHECK: SPAWNED @@ -23,11 +27,22 @@ int main(int argc, char **argv) { argv[0], "2", "3", "4", "2", "3", "4", "2", "3", "4", "2", "3", "4", "2", "3", "4", "2", "3", "4", NULL, }; - char *const env[] = { + char *env[] = { "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", NULL, }; + // When this test runs with a runtime (e.g. ASAN), the spawned process needs + // to use the same runtime search path as the parent. Otherwise, it might + // try to load a runtime that doesn't work and crash before hitting main(), + // failing the test. We technically should forward the variable for the + // current platform, but some platforms have multiple such variables and + // it's quite difficult to plumb this through the lit config. + for (char **e = environ; *e; e++) + if (strncmp(*e, "DYLD_LIBRARY_PATH=", sizeof("DYLD_LIBRARY_PATH=") - 1) == + 0) + env[0] = *e; + pid_t pid; int s = posix_spawn(&pid, argv[0], &file_actions, &attr, args, env); assert(!s); -- cgit v1.2.3