[sanitizer] Get full argv and envp on glibc.

/proc/$PID/cmdline is clipped to 4Kb.
Locate argv and envp on the main thread stack.

llvm-svn: 175163
This commit is contained in:
Evgeniy Stepanov 2013-02-14 14:40:03 +00:00
parent 687af3bb53
commit 2a25bfe06a
1 changed files with 24 additions and 3 deletions

View File

@ -234,6 +234,21 @@ const char *GetEnv(const char *name) {
return 0; // Not found. return 0; // Not found.
} }
#ifdef __GLIBC__
extern "C" {
extern void *__libc_stack_end;
}
static void GetArgsAndEnv(char ***argv, char ***envp) {
uptr *stack_end = (uptr *)__libc_stack_end;
int argc = *stack_end;
*argv = (char**)(stack_end + 1);
*envp = (char**)(stack_end + argc + 2);
}
#else // __GLIBC__
static void ReadNullSepFileToArray(const char *path, char ***arr, static void ReadNullSepFileToArray(const char *path, char ***arr,
int arr_size) { int arr_size) {
char *buff; char *buff;
@ -253,11 +268,17 @@ static void ReadNullSepFileToArray(const char *path, char ***arr,
(*arr)[count] = 0; (*arr)[count] = 0;
} }
void ReExec() { static void GetArgsAndEnv(char ***argv, char ***envp) {
static const int kMaxArgv = 2000, kMaxEnvp = 2000; static const int kMaxArgv = 2000, kMaxEnvp = 2000;
ReadNullSepFileToArray("/proc/self/cmdline", argv, kMaxArgv);
ReadNullSepFileToArray("/proc/self/environ", envp, kMaxEnvp);
}
#endif // __GLIBC__
void ReExec() {
char **argv, **envp; char **argv, **envp;
ReadNullSepFileToArray("/proc/self/cmdline", &argv, kMaxArgv); GetArgsAndEnv(&argv, &envp);
ReadNullSepFileToArray("/proc/self/environ", &envp, kMaxEnvp);
execve(argv[0], argv, envp); execve(argv[0], argv, envp);
} }