forked from OSchip/llvm-project
[sanitizer] Use AT_EXECFN in ReExec() if available
execve("/proc/self/exe") will not work if the binary relies on $EXEC_ORIGIN in an rpath. Query AT_EXECFN instead, which will give the same string that the current binary was exec'd with. Differential Revision: https://reviews.llvm.org/D54113 llvm-svn: 346215
This commit is contained in:
parent
25f8d204b8
commit
178d26fa18
|
@ -640,6 +640,10 @@ void ReExec() {
|
|||
#elif SANITIZER_SOLARIS
|
||||
pathname = getexecname();
|
||||
CHECK_NE(pathname, NULL);
|
||||
#elif SANITIZER_USE_GETAUXVAL
|
||||
// Calling execve with /proc/self/exe sets that as $EXEC_ORIGIN. Binaries that
|
||||
// rely on that will fail to load shared libraries. Query AT_EXECFN instead.
|
||||
pathname = reinterpret_cast<const char *>(getauxval(AT_EXECFN));
|
||||
#endif
|
||||
|
||||
GetArgsAndEnv(&argv, &envp);
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
// MSAN re-execs on unlimited stacks. We use that to verify ReExec() uses the
|
||||
// right path.
|
||||
// RUN: %clangxx_msan -O0 %s -o %t && ulimit -s unlimited && %run %t | FileCheck %s
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#if !defined(__GLIBC_PREREQ)
|
||||
#define __GLIBC_PREREQ(a, b) 0
|
||||
#endif
|
||||
|
||||
#if __GLIBC_PREREQ(2, 16)
|
||||
#include <sys/auxv.h>
|
||||
#endif
|
||||
|
||||
int main() {
|
||||
#if __GLIBC_PREREQ(2, 16)
|
||||
// Make sure AT_EXECFN didn't get overwritten by re-exec.
|
||||
puts(reinterpret_cast<const char *>(getauxval(AT_EXECFN)));
|
||||
#else
|
||||
puts("No getauxval");
|
||||
#endif
|
||||
// CHECK-NOT: /proc/self/exe
|
||||
}
|
Loading…
Reference in New Issue