[msan] Fix ReExec on linux.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Tue, 19 Feb 2013 11:09:29 +0000 (11:09 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Tue, 19 Feb 2013 11:09:29 +0000 (11:09 +0000)
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
compiler-rt/lib/sanitizer_common/sanitizer_linux.cc

index 8a01da3..d28d83c 100644 (file)
@@ -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)
index 73626b0..1f3d68e 100644 (file)
@@ -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() {