diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-04-23 12:49:12 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-04-23 12:49:12 +0000 |
commit | ff7c14f911463db91b574533f62eb847a2e08b1c (patch) | |
tree | 9b80dd268f45d9b990c88e478af162adc9908531 | |
parent | 51e9728c7202ae8111a308fcba74f5126075c42a (diff) | |
download | compiler-rt-ff7c14f911463db91b574533f62eb847a2e08b1c.tar.gz |
Revert r180082 and add a test for SetEnv function
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@180098 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/tests/sanitizer_linux_test.cc | 9 |
3 files changed, 24 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common.h b/lib/sanitizer_common/sanitizer_common.h index 15847a79a..9df510b85 100644 --- a/lib/sanitizer_common/sanitizer_common.h +++ b/lib/sanitizer_common/sanitizer_common.h @@ -130,6 +130,7 @@ void DisableCoreDumper(); void DumpProcessMap(); bool FileExists(const char *filename); const char *GetEnv(const char *name); +bool SetEnv(const char *name, const char *value); const char *GetPwd(); u32 GetUid(); void ReExec(); diff --git a/lib/sanitizer_common/sanitizer_linux.cc b/lib/sanitizer_common/sanitizer_linux.cc index cd651935b..ef185571a 100644 --- a/lib/sanitizer_common/sanitizer_linux.cc +++ b/lib/sanitizer_common/sanitizer_linux.cc @@ -264,6 +264,20 @@ const char *GetEnv(const char *name) { return 0; // Not found. } +// Does not compile for Go because dlsym() requires -ldl +#ifndef SANITIZER_GO +bool SetEnv(const char *name, const char *value) { + void *f = dlsym(RTLD_NEXT, "setenv"); + if (f == 0) + return false; + typedef int(*setenv_ft)(const char *name, const char *value, int overwrite); + setenv_ft setenv_f; + CHECK_EQ(sizeof(setenv_f), sizeof(f)); + internal_memcpy(&setenv_f, &f, sizeof(f)); + return setenv_f(name, value, 1) == 0; +} +#endif + #ifdef __GLIBC__ extern "C" { diff --git a/lib/sanitizer_common/tests/sanitizer_linux_test.cc b/lib/sanitizer_common/tests/sanitizer_linux_test.cc index 035c11fa4..0560fb57b 100644 --- a/lib/sanitizer_common/tests/sanitizer_linux_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_linux_test.cc @@ -20,6 +20,7 @@ #include <pthread.h> #include <sched.h> +#include <stdlib.h> #include <algorithm> #include <vector> @@ -185,6 +186,14 @@ TEST_F(ThreadListerTest, ResetMakesNewThreadsKnown) { ASSERT_TRUE(HasElement(threads_after_extra, extra_tid)); } +TEST(SanitizerCommon, SetEnvTest) { + const char kEnvName[] = "ENV_FOO"; + SetEnv(kEnvName, "value"); + EXPECT_STREQ("value", getenv(kEnvName)); + unsetenv(kEnvName); + EXPECT_EQ(0, getenv(kEnvName)); +} + } // namespace __sanitizer #endif // __linux__ |