diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-02-19 11:09:29 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-02-19 11:09:29 +0000 |
commit | f35eae83757946decb312deab3f0fe155fe5d580 (patch) | |
tree | 7f929d1a21595f2812e0f36a68b5d4345794db9a /lib | |
parent | b711ca6e040d0ac4adb79e688e1a59afcc871d20 (diff) |
[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.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@175504 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/msan/msan.cc | 6 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_linux.cc | 4 |
2 files changed, 7 insertions, 3 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index 8a01da310..d28d83ce2 100644 --- a/lib/msan/msan.cc +++ b/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 : "<empty>"); + msan_running_under_dr = IsRunningUnderDr(); __msan_clear_on_return(); if (__msan_track_origins && flags()->verbosity > 0) diff --git a/lib/sanitizer_common/sanitizer_linux.cc b/lib/sanitizer_common/sanitizer_linux.cc index 73626b076..1f3d68e9a 100644 --- a/lib/sanitizer_common/sanitizer_linux.cc +++ b/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() { |