From adaca585268d813075051cfcad175697d5d1904f Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Tue, 19 Feb 2013 11:09:29 +0000 Subject: [PATCH] [msan] Fix ReExec on linux. execle(argv[0], ...) is wrong, because argv[0] may contain a PATH-resolvable program name. Execute /proc/self/exe instead. llvm-svn: 175504 --- compiler-rt/lib/msan/msan.cc | 6 ++++-- compiler-rt/lib/sanitizer_common/sanitizer_linux.cc | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc index 8a01da3..d28d83c 100644 --- a/compiler-rt/lib/msan/msan.cc +++ b/compiler-rt/lib/msan/msan.cc @@ -222,6 +222,8 @@ void __msan_init() { InitializeInterceptors(); ReplaceOperatorsNewAndDelete(); + const char *msan_options = GetEnv("MSAN_OPTIONS"); + InitializeFlags(&msan_flags, msan_options); if (StackSizeIsUnlimited()) { if (flags()->verbosity) Printf("Unlimited stack, doing reexec\n"); @@ -230,10 +232,10 @@ void __msan_init() { SetStackSizeLimitInBytes(32 * 1024 * 1024); ReExec(); } - const char *msan_options = GetEnv("MSAN_OPTIONS"); - InitializeFlags(&msan_flags, msan_options); + if (flags()->verbosity) Printf("MSAN_OPTIONS: %s\n", msan_options ? msan_options : ""); + msan_running_under_dr = IsRunningUnderDr(); __msan_clear_on_return(); if (__msan_track_origins && flags()->verbosity > 0) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index 73626b0..1f3d68e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -279,7 +279,9 @@ static void GetArgsAndEnv(char ***argv, char ***envp) { void ReExec() { char **argv, **envp; GetArgsAndEnv(&argv, &envp); - execve(argv[0], argv, envp); + execve("/proc/self/exe", argv, envp); + Printf("execve failed, errno %d\n", errno); + Die(); } void PrepareForSandboxing() { -- 2.7.4