summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-04-23 12:49:12 +0000
committerAlexey Samsonov <samsonov@google.com>2013-04-23 12:49:12 +0000
commitff7c14f911463db91b574533f62eb847a2e08b1c (patch)
tree9b80dd268f45d9b990c88e478af162adc9908531
parent51e9728c7202ae8111a308fcba74f5126075c42a (diff)
downloadcompiler-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.h1
-rw-r--r--lib/sanitizer_common/sanitizer_linux.cc14
-rw-r--r--lib/sanitizer_common/tests/sanitizer_linux_test.cc9
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__