[compiler-rt] r180599 - [sanitizer] Clear LD_PRELOAD when forking an external symbolizer.
Sergey Matveev
earthdok at google.com
Fri Apr 26 04:35:06 PDT 2013
Author: smatveev
Date: Fri Apr 26 06:35:05 2013
New Revision: 180599
URL: http://llvm.org/viewvc/llvm-project?rev=180599&view=rev
Log:
[sanitizer] Clear LD_PRELOAD when forking an external symbolizer.
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_linux.cc
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=180599&r1=180598&r2=180599&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Fri Apr 26 06:35:05 2013
@@ -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();
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=180599&r1=180598&r2=180599&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Fri Apr 26 06:35:05 2013
@@ -278,6 +278,20 @@ bool SetEnv(const char *name, const char
}
#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" {
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_linux.cc?rev=180599&r1=180598&r2=180599&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_linux.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_linux.cc Fri Apr 26 06:35:05 2013
@@ -100,6 +100,11 @@ bool StartSymbolizerSubprocess(const cha
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);
}
More information about the llvm-commits
mailing list