diff options
author | Sergey Matveev <earthdok@google.com> | 2013-04-26 11:35:05 +0000 |
---|---|---|
committer | Sergey Matveev <earthdok@google.com> | 2013-04-26 11:35:05 +0000 |
commit | ab06583d10baafeb657ad3e87d77f4ebfb2a6190 (patch) | |
tree | 9c44b5500e4a852cf740eb0cdd39d450070b929f | |
parent | e14f63dab5f7edade46db53e7d4938ea0302ef9e (diff) |
[sanitizer] Clear LD_PRELOAD when forking an external symbolizer.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@180599 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_common.h | 1 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_linux.cc | 14 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer_linux.cc | 5 |
3 files changed, 20 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common.h b/lib/sanitizer_common/sanitizer_common.h index 9df510b85..9335ca71a 100644 --- a/lib/sanitizer_common/sanitizer_common.h +++ b/lib/sanitizer_common/sanitizer_common.h @@ -131,6 +131,7 @@ void DumpProcessMap(); bool FileExists(const char *filename); const char *GetEnv(const char *name); bool SetEnv(const char *name, const char *value); +void UnsetEnv(const char *name); const char *GetPwd(); u32 GetUid(); void ReExec(); diff --git a/lib/sanitizer_common/sanitizer_linux.cc b/lib/sanitizer_common/sanitizer_linux.cc index ef185571a..1c9cbf83a 100644 --- a/lib/sanitizer_common/sanitizer_linux.cc +++ b/lib/sanitizer_common/sanitizer_linux.cc @@ -278,6 +278,20 @@ bool SetEnv(const char *name, const char *value) { } #endif +void UnsetEnv(const char *name) { + uptr name_length = internal_strlen(name); + uptr last = 0; + while (environ[last]) last++; + for (uptr i = 0; environ[i]; i++) + if (internal_strlen(environ[i]) >= name_length + 1 && + internal_strncmp(environ[i], name, name_length) == 0 && + environ[i][name_length] == '=') { + last--; + environ[i] = environ[last]; + environ[last] = 0; + } +} + #ifdef __GLIBC__ extern "C" { diff --git a/lib/sanitizer_common/sanitizer_symbolizer_linux.cc b/lib/sanitizer_common/sanitizer_symbolizer_linux.cc index 14a682bd9..5c98e93ac 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_linux.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer_linux.cc @@ -100,6 +100,11 @@ bool StartSymbolizerSubprocess(const char *path_to_symbolizer, internal_close(infd[1]); for (int fd = getdtablesize(); fd > 2; fd--) internal_close(fd); + // If the parent tool is used as a preloadable library, do not apply it to + // the symbolizer. + // FIXME: If LD_PRELOAD contains more than one object, we should keep those + // that have nothing to do with us. + UnsetEnv("LD_PRELOAD"); execl(path_to_symbolizer, path_to_symbolizer, (char*)0); internal__exit(1); } |