[compiler-rt] r321544 - [msan] Intercept pthread_getname_np.

Evgeniy Stepanov via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 28 15:06:51 PST 2017


Author: eugenis
Date: Thu Dec 28 15:06:51 2017
New Revision: 321544

URL: http://llvm.org/viewvc/llvm-project?rev=321544&view=rev
Log:
[msan] Intercept pthread_getname_np.

Added:
    compiler-rt/trunk/test/msan/pthread_getname_np.cc
Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=321544&r1=321543&r2=321544&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Thu Dec 28 15:06:51 2017
@@ -4551,6 +4551,20 @@ INTERCEPTOR(int, pthread_setname_np, upt
 #define INIT_PTHREAD_SETNAME_NP
 #endif
 
+#if SANITIZER_INTERCEPT_PTHREAD_GETNAME_NP
+INTERCEPTOR(int, pthread_getname_np, uptr thread, char *name, SIZE_T len) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, pthread_getname_np, thread, name, len);
+  int res = REAL(pthread_getname_np)(thread, name, len);
+  if (!res)
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, name, internal_strnlen(name, len) + 1);
+  return res;
+}
+#define INIT_PTHREAD_GETNAME_NP COMMON_INTERCEPT_FUNCTION(pthread_getname_np);
+#else
+#define INIT_PTHREAD_GETNAME_NP
+#endif
+
 #if SANITIZER_INTERCEPT_SINCOS
 INTERCEPTOR(void, sincos, double x, double *sin, double *cos) {
   void *ctx;
@@ -6541,6 +6555,7 @@ static void InitializeCommonInterceptors
   INIT_TTYNAME_R;
   INIT_TEMPNAM;
   INIT_PTHREAD_SETNAME_NP;
+  INIT_PTHREAD_GETNAME_NP;
   INIT_SINCOS;
   INIT_REMQUO;
   INIT_LGAMMA;

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=321544&r1=321543&r2=321544&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h Thu Dec 28 15:06:51 2017
@@ -343,6 +343,8 @@
 #define SANITIZER_INTERCEPT_PHTREAD_MUTEX SI_POSIX
 #define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
   (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
+#define SANITIZER_INTERCEPT_PTHREAD_GETNAME_NP \
+  (SI_FREEBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
 
 #define SANITIZER_INTERCEPT_TLS_GET_ADDR \
   (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)

Added: compiler-rt/trunk/test/msan/pthread_getname_np.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/msan/pthread_getname_np.cc?rev=321544&view=auto
==============================================================================
--- compiler-rt/trunk/test/msan/pthread_getname_np.cc (added)
+++ compiler-rt/trunk/test/msan/pthread_getname_np.cc Thu Dec 28 15:06:51 2017
@@ -0,0 +1,34 @@
+// RUN: %clangxx_msan -std=c++11 -O0 %s -o %t && %run %t
+// UNSUPPORTED: android, netbsd
+
+// Regression test for a deadlock in pthread_getattr_np
+
+#include <assert.h>
+#include <pthread.h>
+#include <string.h>
+#include <sanitizer/msan_interface.h>
+
+#include <stdio.h>
+
+void *ThreadFn(void *) {
+  return nullptr;
+}
+
+int main(void) {
+  pthread_t t;
+  int res = pthread_create(&t, 0, ThreadFn, 0);
+  assert(!res);
+
+  const char *kMyThreadName = "my-thread-name";
+  res = pthread_setname_np(t, kMyThreadName);
+  assert(!res);
+
+  char buf[100];
+  res = pthread_getname_np(t, buf, sizeof(buf));
+  assert(!res);
+  assert(strcmp(buf, kMyThreadName) == 0);
+
+  res = pthread_join(t, 0);
+  assert(!res);
+  return 0;
+}




More information about the llvm-commits mailing list