[compiler-rt] r175504 - [msan] Fix ReExec on linux.
Evgeniy Stepanov
eugeni.stepanov at gmail.com
Tue Feb 19 03:09:29 PST 2013
Author: eugenis
Date: Tue Feb 19 05:09:29 2013
New Revision: 175504
URL: http://llvm.org/viewvc/llvm-project?rev=175504&view=rev
Log:
[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.
Modified:
compiler-rt/trunk/lib/msan/msan.cc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
Modified: compiler-rt/trunk/lib/msan/msan.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cc?rev=175504&r1=175503&r2=175504&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan.cc (original)
+++ compiler-rt/trunk/lib/msan/msan.cc Tue Feb 19 05:09:29 2013
@@ -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)
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=175504&r1=175503&r2=175504&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Tue Feb 19 05:09:29 2013
@@ -279,7 +279,9 @@ static void GetArgsAndEnv(char ***argv,
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() {
More information about the llvm-commits
mailing list