[compiler-rt] b5c0fcd - [sanitizer_common] posix_spawn test should forward DYLD_LIBRARY_PATH (#168795)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 20 10:40:17 PST 2025
Author: Andrew Haberlandt
Date: 2025-11-20T10:40:13-08:00
New Revision: b5c0fcdadeed8803addf8d2aec6142fb9d8a5660
URL: https://github.com/llvm/llvm-project/commit/b5c0fcdadeed8803addf8d2aec6142fb9d8a5660
DIFF: https://github.com/llvm/llvm-project/commit/b5c0fcdadeed8803addf8d2aec6142fb9d8a5660.diff
LOG: [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.
Added:
Modified:
compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c
Removed:
################################################################################
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 <assert.h>
#include <spawn.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <sys/wait.h>
+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
diff icult 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);
More information about the llvm-commits
mailing list