diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-09-17 09:12:39 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-09-17 09:12:39 +0000 |
commit | d7e5bb4043adf4756e6f8cfe0f5a3165b185474d (patch) | |
tree | 9c12002c83e16b342dcf6d7bbe5e36ebc51ed511 /lib | |
parent | 62e27098b97e5ef74931c536350123a3df9dec6d (diff) |
[Sanitizer] Hoist functions to get/set stack size and re-exec from memory-sanitizer branch to sanitizer_common
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@164020 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sanitizer_common/sanitizer_common.h | 8 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_linux.cc | 20 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_mac.cc | 4 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_posix.cc | 14 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_win.cc | 13 |
5 files changed, 57 insertions, 2 deletions
diff --git a/lib/sanitizer_common/sanitizer_common.h b/lib/sanitizer_common/sanitizer_common.h index 544f8e4aa..c4d236447 100644 --- a/lib/sanitizer_common/sanitizer_common.h +++ b/lib/sanitizer_common/sanitizer_common.h @@ -112,12 +112,16 @@ uptr ReadFileToBuffer(const char *file_name, char **buff, // in '*buff_size'. void *MapFileToMemory(const char *file_name, uptr *buff_size); +// OS +void DisableCoreDumper(); +void DumpProcessMap(); const char *GetEnv(const char *name); const char *GetPwd(); +void ReExec(); +bool StackSizeIsUnlimited(); +void SetStackSizeLimitInBytes(uptr limit); // Other -void DisableCoreDumper(); -void DumpProcessMap(); void SleepForSeconds(int seconds); void SleepForMillis(int millis); int Atexit(void (*function)(void)); diff --git a/lib/sanitizer_common/sanitizer_linux.cc b/lib/sanitizer_common/sanitizer_linux.cc index 853be7a73..a280a8bca 100644 --- a/lib/sanitizer_common/sanitizer_linux.cc +++ b/lib/sanitizer_common/sanitizer_linux.cc @@ -164,6 +164,26 @@ const char *GetEnv(const char *name) { return 0; // Not found. } +void ReExec() { + static const int kMaxArgv = 100; + InternalScopedBuffer<char*> argv(kMaxArgv + 1); + static char *buff; + uptr buff_size = 0; + ReadFileToBuffer("/proc/self/cmdline", &buff, &buff_size, 1024 * 1024); + argv[0] = buff; + int argc, i; + for (argc = 1, i = 1; ; i++) { + if (buff[i] == 0) { + if (buff[i+1] == 0) break; + argv[argc] = &buff[i+1]; + CHECK_LE(argc, kMaxArgv); // FIXME: make this more flexible. + argc++; + } + } + argv[argc] = 0; + execv(argv[0], argv.data()); +} + // ----------------- sanitizer_procmaps.h MemoryMappingLayout::MemoryMappingLayout() { proc_self_maps_buff_len_ = diff --git a/lib/sanitizer_common/sanitizer_mac.cc b/lib/sanitizer_common/sanitizer_mac.cc index ca55c8ce7..202c4f702 100644 --- a/lib/sanitizer_common/sanitizer_mac.cc +++ b/lib/sanitizer_common/sanitizer_mac.cc @@ -110,6 +110,10 @@ const char *GetEnv(const char *name) { return 0; } +void ReExec() { + UNIMPLEMENTED(); +} + // ----------------- sanitizer_procmaps.h MemoryMappingLayout::MemoryMappingLayout() { diff --git a/lib/sanitizer_common/sanitizer_posix.cc b/lib/sanitizer_common/sanitizer_posix.cc index 143fcb003..e3f851611 100644 --- a/lib/sanitizer_common/sanitizer_posix.cc +++ b/lib/sanitizer_common/sanitizer_posix.cc @@ -138,6 +138,20 @@ void DisableCoreDumper() { setrlimit(RLIMIT_CORE, &nocore); } +bool StackSizeIsUnlimited() { + struct rlimit rlim; + CHECK_EQ(0, getrlimit(RLIMIT_STACK, &rlim)); + return (rlim.rlim_cur == (uptr)-1); +} + +void SetStackSizeLimitInBytes(uptr limit) { + struct rlimit rlim; + rlim.rlim_cur = limit; + rlim.rlim_max = limit; + CHECK_EQ(0, setrlimit(RLIMIT_STACK, &rlim)); + CHECK(!StackSizeIsUnlimited()); +} + void SleepForSeconds(int seconds) { sleep(seconds); } diff --git a/lib/sanitizer_common/sanitizer_win.cc b/lib/sanitizer_common/sanitizer_win.cc index b2ddd61c6..680184f26 100644 --- a/lib/sanitizer_common/sanitizer_win.cc +++ b/lib/sanitizer_common/sanitizer_win.cc @@ -109,6 +109,19 @@ void DisableCoreDumper() { UNIMPLEMENTED(); } +void ReExec() { + UNIMPLEMENTED(); +} + +bool StackSizeIsUnlimited() { + UNIMPLEMENTED(); + return false; +} + +void SetStackSizeLimitInBytes(uptr limit) { + UNIMPLEMENTED(); +} + void SleepForSeconds(int seconds) { Sleep(seconds * 1000); } |