[sanitizer] Clear LD_PRELOAD when forking an external symbolizer.

llvm-svn: 180599
This commit is contained in:
Sergey Matveev 2013-04-26 11:35:05 +00:00
parent f53c3ca9eb
commit 3c8fbe1013
3 changed files with 20 additions and 0 deletions

View File

@ -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();

View File

@ -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" {

View File

@ -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);
}