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 ea58b92af6097..1a66a6166dd1d 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);