summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib
diff options
context:
space:
mode:
authorSergey Matveev <earthdok@google.com>2014-02-06 15:12:56 +0000
committerSergey Matveev <earthdok@google.com>2014-02-06 15:12:56 +0000
commit0c62992d6e42a92ef02bfcaa1faf2fa7c236fb76 (patch)
tree3971e779fe9071f021358b32cd108826c1ef604e /compiler-rt/lib
parent54461eb38953d17a9a9b7aeff90ef59f65884a86 (diff)
downloadbcm5719-llvm-0c62992d6e42a92ef02bfcaa1faf2fa7c236fb76.tar.gz
bcm5719-llvm-0c62992d6e42a92ef02bfcaa1faf2fa7c236fb76.zip
[sanitizer] Intercept getresuid and getresgid.
llvm-svn: 200925
Diffstat (limited to 'compiler-rt/lib')
-rw-r--r--compiler-rt/lib/msan/lit_tests/Linux/getresid.cc25
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc32
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h1
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc1
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h1
5 files changed, 59 insertions, 1 deletions
diff --git a/compiler-rt/lib/msan/lit_tests/Linux/getresid.cc b/compiler-rt/lib/msan/lit_tests/Linux/getresid.cc
new file mode 100644
index 00000000000..5021009e836
--- /dev/null
+++ b/compiler-rt/lib/msan/lit_tests/Linux/getresid.cc
@@ -0,0 +1,25 @@
+// RUN: %clangxx_msan -m64 -O0 %s -o %t && %t %p 2>&1
+// RUN: %clangxx_msan -m64 -O0 -D_FILE_OFFSET_BITS=64 %s -o %t && %t %p 2>&1
+// RUN: %clangxx_msan -m64 -O3 %s -o %t && %t %p 2>&1
+
+#include <assert.h>
+#include <unistd.h>
+
+#include <sanitizer/msan_interface.h>
+
+int main(int argc, char *argv[]) {
+ uid_t uids[6];
+ assert(0 == __msan_test_shadow(uids, 6 * sizeof(uid_t)));
+ assert(0 == getresuid(&uids[0], &uids[2], &uids[4]));
+ for (int i = 0; i < 3; i++)
+ assert(sizeof(uid_t) ==
+ __msan_test_shadow(uids + 2 * i, 2 * sizeof(uid_t)));
+
+ gid_t gids[6];
+ assert(0 == __msan_test_shadow(gids, 6 * sizeof(gid_t)));
+ assert(0 == getresgid(&gids[0], &gids[2], &gids[4]));
+ for (int i = 0; i < 3; i++)
+ assert(sizeof(gid_t) ==
+ __msan_test_shadow(gids + 2 * i, 2 * sizeof(gid_t)));
+ return 0;
+}
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 72d72c761eb..b29fd1c700b 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -3161,6 +3161,35 @@ INTERCEPTOR(SSIZE_T, fgetxattr, int fd, const char *name, char *value,
#define INIT_GETXATTR
#endif
+#if SANITIZER_INTERCEPT_GETRESID
+INTERCEPTOR(int, getresuid, void *ruid, void *euid, void *suid) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, getresuid, ruid, euid, suid);
+ int res = REAL(getresuid)(ruid, euid, suid);
+ if (res >= 0) {
+ if (ruid) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ruid, uid_t_sz);
+ if (euid) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, euid, uid_t_sz);
+ if (suid) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, suid, uid_t_sz);
+ }
+ return res;
+}
+INTERCEPTOR(int, getresgid, void *rgid, void *egid, void *sgid) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, getresgid, rgid, egid, sgid);
+ int res = REAL(getresgid)(rgid, egid, sgid);
+ if (res >= 0) {
+ if (rgid) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, rgid, gid_t_sz);
+ if (egid) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, egid, gid_t_sz);
+ if (sgid) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, sgid, gid_t_sz);
+ }
+ return res;
+}
+#define INIT_GETRESID \
+ COMMON_INTERCEPT_FUNCTION(getresuid); \
+ COMMON_INTERCEPT_FUNCTION(getresgid);
+#else
+#define INIT_GETRESID
+#endif
#define SANITIZER_COMMON_INTERCEPTORS_INIT \
INIT_TEXTDOMAIN; \
@@ -3279,5 +3308,6 @@ INTERCEPTOR(SSIZE_T, fgetxattr, int fd, const char *name, char *value,
INIT_TIMES; \
INIT_TLS_GET_ADDR; \
INIT_LISTXATTR; \
- INIT_GETXATTR;
+ INIT_GETXATTR; \
+ INIT_GETRESID;
/**/
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
index d70e666705e..a70211b97f3 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -181,5 +181,6 @@
#define SANITIZER_INTERCEPT_LISTXATTR SI_LINUX
#define SANITIZER_INTERCEPT_GETXATTR SI_LINUX
+#define SANITIZER_INTERCEPT_GETRESID SI_LINUX
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
index 0cb6685c1a4..c794fd1163f 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
@@ -137,6 +137,7 @@ namespace __sanitizer {
unsigned pid_t_sz = sizeof(pid_t);
unsigned timeval_sz = sizeof(timeval);
unsigned uid_t_sz = sizeof(uid_t);
+ unsigned gid_t_sz = sizeof(gid_t);
unsigned mbstate_t_sz = sizeof(mbstate_t);
unsigned sigset_t_sz = sizeof(sigset_t);
unsigned struct_timezone_sz = sizeof(struct timezone);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index 55cb0d54223..7097be58a54 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -34,6 +34,7 @@ namespace __sanitizer {
extern unsigned pid_t_sz;
extern unsigned timeval_sz;
extern unsigned uid_t_sz;
+ extern unsigned gid_t_sz;
extern unsigned mbstate_t_sz;
extern unsigned struct_timezone_sz;
extern unsigned struct_tms_sz;
OpenPOWER on IntegriCloud