From 2a25bfe06a3eea7d57d96758d7a50cefdd47c354 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Thu, 14 Feb 2013 14:40:03 +0000 Subject: [PATCH] [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 --- .../lib/sanitizer_common/sanitizer_linux.cc | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index 691ce19b3759..73626b076a94 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -234,6 +234,21 @@ const char *GetEnv(const char *name) { 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, int arr_size) { char *buff; @@ -253,11 +268,17 @@ static void ReadNullSepFileToArray(const char *path, char ***arr, (*arr)[count] = 0; } -void ReExec() { +static void GetArgsAndEnv(char ***argv, char ***envp) { 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; - ReadNullSepFileToArray("/proc/self/cmdline", &argv, kMaxArgv); - ReadNullSepFileToArray("/proc/self/environ", &envp, kMaxEnvp); + GetArgsAndEnv(&argv, &envp); execve(argv[0], argv, envp); }