summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-02-19 11:09:29 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-02-19 11:09:29 +0000
commitf35eae83757946decb312deab3f0fe155fe5d580 (patch)
tree7f929d1a21595f2812e0f36a68b5d4345794db9a /lib
parentb711ca6e040d0ac4adb79e688e1a59afcc871d20 (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.cc6
-rw-r--r--lib/sanitizer_common/sanitizer_linux.cc4
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() {