[msan] Add an interceptor for ttyname().
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 1 Mar 2019 18:22:44 +0000 (18:22 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 1 Mar 2019 18:22:44 +0000 (18:22 +0000)
llvm-svn: 355214

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
compiler-rt/test/msan/Linux/forkpty.cc

index 5e0be8b..abe487e 100644 (file)
@@ -4738,6 +4738,20 @@ INTERCEPTOR(char *, tmpnam_r, char *s) {
 #define INIT_TMPNAM_R
 #endif
 
+#if SANITIZER_INTERCEPT_TTYNAME
+INTERCEPTOR(char *, ttyname, int fd) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, ttyname, fd);
+  char *res = REAL(ttyname)(fd);
+  if (res != nullptr)
+    COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1);
+  return res;
+}
+#define INIT_TTYNAME COMMON_INTERCEPT_FUNCTION(ttyname);
+#else
+#define INIT_TTYNAME
+#endif
+
 #if SANITIZER_INTERCEPT_TTYNAME_R
 INTERCEPTOR(int, ttyname_r, int fd, char *name, SIZE_T namesize) {
   void *ctx;
@@ -9653,6 +9667,7 @@ static void InitializeCommonInterceptors() {
   INIT_PTHREAD_BARRIERATTR_GETPSHARED;
   INIT_TMPNAM;
   INIT_TMPNAM_R;
+  INIT_TTYNAME;
   INIT_TTYNAME_R;
   INIT_TEMPNAM;
   INIT_PTHREAD_SETNAME_NP;
index 9c71714..906740c 100644 (file)
 #define SANITIZER_INTERCEPT_THR_EXIT SI_FREEBSD
 #define SANITIZER_INTERCEPT_TMPNAM SI_POSIX
 #define SANITIZER_INTERCEPT_TMPNAM_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
+#define SANITIZER_INTERCEPT_TTYNAME SI_POSIX
 #define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX
 #define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX
 #define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS
index c9f0437..dca83d9 100644 (file)
@@ -15,9 +15,12 @@ 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);
+  char name[255];
+  ttyname_r(master, name, sizeof(name));
+  assert(__msan_test_shadow(name, strlen(name) + 1) == -1);
+
+  char *name_p = ttyname(master);
+  assert(__msan_test_shadow(name_p, strlen(name_p) + 1) == -1);
 
   int master2;
   forkpty(&master2, NULL, NULL, NULL);