summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_linux.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sanitizer_common/sanitizer_linux.cc')
-rw-r--r--lib/sanitizer_common/sanitizer_linux.cc20
1 files changed, 20 insertions, 0 deletions
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_ =