diff options
author | Keno Fischer <kfischer@college.harvard.edu> | 2016-09-09 23:09:34 +0000 |
---|---|---|
committer | Keno Fischer <kfischer@college.harvard.edu> | 2016-09-09 23:09:34 +0000 |
commit | 8dc0e0943b9e9b864b91a50e991392db09f2dc49 (patch) | |
tree | 3a96a92d0cb91b89dce0e3efb97a4266595d63d5 | |
parent | efcc5c43906f65eaaac8d00170c175bb4dbbdcc5 (diff) | |
download | bcm5719-llvm-8dc0e0943b9e9b864b91a50e991392db09f2dc49.tar.gz bcm5719-llvm-8dc0e0943b9e9b864b91a50e991392db09f2dc49.zip |
[sanitizer] Add interceptor for ttyname_r
Reviewers: eugenis
Subscribers: kubabrecka, llvm-commits
Differential Revision: https://reviews.llvm.org/D24375
llvm-svn: 281116
3 files changed, 22 insertions, 0 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index f9ccca3e106..d090fc2f5fb 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -4183,6 +4183,20 @@ INTERCEPTOR(char *, tmpnam_r, char *s) { #define INIT_TMPNAM_R #endif +#if SANITIZER_INTERCEPT_TTYNAME_R +INTERCEPTOR(int, ttyname_r, int fd, char *name, SIZE_T namesize) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, ttyname_r, fd, name, namesize); + int res = REAL(ttyname_r)(fd, name, namesize); + if (res == 0) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, name, REAL(strlen)(name) + 1); + return res; +} +#define INIT_TTYNAME_R COMMON_INTERCEPT_FUNCTION(ttyname_r); +#else +#define INIT_TTYNAME_R +#endif + #if SANITIZER_INTERCEPT_TEMPNAM INTERCEPTOR(char *, tempnam, char *dir, char *pfx) { void *ctx; @@ -6008,6 +6022,7 @@ static void InitializeCommonInterceptors() { INIT_PTHREAD_BARRIERATTR_GETPSHARED; INIT_TMPNAM; INIT_TMPNAM_R; + INIT_TTYNAME_R; INIT_TEMPNAM; INIT_PTHREAD_SETNAME_NP; INIT_SINCOS; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 1e53dd16341..8904a12f9f0 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -235,6 +235,7 @@ #define SANITIZER_INTERCEPT_PTHREAD_BARRIERATTR_GETPSHARED SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_TMPNAM SI_NOT_WINDOWS #define SANITIZER_INTERCEPT_TMPNAM_R SI_LINUX_NOT_ANDROID +#define SANITIZER_INTERCEPT_TTYNAME_R SI_NOT_WINDOWS #define SANITIZER_INTERCEPT_TEMPNAM SI_NOT_WINDOWS #define SANITIZER_INTERCEPT_SINCOS SI_LINUX #define SANITIZER_INTERCEPT_REMQUO SI_NOT_WINDOWS diff --git a/compiler-rt/test/msan/Linux/forkpty.cc b/compiler-rt/test/msan/Linux/forkpty.cc index d371a494818..c9f04376fd7 100644 --- a/compiler-rt/test/msan/Linux/forkpty.cc +++ b/compiler-rt/test/msan/Linux/forkpty.cc @@ -2,6 +2,8 @@ #include <assert.h> #include <pty.h> +#include <unistd.h> +#include <cstring> #include <sanitizer/msan_interface.h> @@ -13,6 +15,10 @@ main (int argc, char** argv) assert(__msan_test_shadow(&master, sizeof(master)) == -1); assert(__msan_test_shadow(&slave, sizeof(slave)) == -1); + char ttyname[255]; + ttyname_r(master, ttyname, sizeof(ttyname)); + assert(__msan_test_shadow(ttyname, strlen(ttyname) + 1) == -1); + int master2; forkpty(&master2, NULL, NULL, NULL); assert(__msan_test_shadow(&master2, sizeof(master2)) == -1); |