[PATCH] D40243: Handle NetBSD specific indirection of libpthread functions

Kamil Rytarowski via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 20 05:08:02 PST 2017


krytarowski created this revision.
krytarowski added a project: Sanitizers.
Herald added a subscriber: kubamracek.

Correct handling of libpthread(3) functions in TSan/NetBSD:

- pthread_cond_init(3),
- pthread_cond_signal(3),
- pthread_cond_broadcast(3),
- pthread_cond_wait(3),
- pthread_cond_destroy(3),
- pthread_mutex_init(3),
- pthread_mutex_destroy(3),
- pthread_mutex_trylock(3),
- pthread_rwlock_init(3),
- pthread_rwlock_destroy(3),
- pthread_rwlock_rdlock(3),
- pthread_rwlock_tryrdlock(3),
- pthread_rwlock_wrlock(3),
- pthread_rwlock_trywrlock(3),
- pthread_rwlock_unlock(3),
- pthread_once(3).

Code out of the libpthread(3) context uses the libc symbols
that are prefixed with __libc_, for example: __libc_cond_init.

This caused that these functions were invisible to sanitizers on NetBSD.
Intercept the libc-specific ones and add them as NetBSD-specific aliases
for the common pthread(3) ones.

NetBSD needs to intercept both functions, as the regularly named ones
are used internally in libpthread(3).

Sponsored by <The NetBSD Foundation>


Repository:
  rL LLVM

https://reviews.llvm.org/D40243

Files:
  lib/tsan/rtl/tsan_interceptors.cc


Index: lib/tsan/rtl/tsan_interceptors.cc
===================================================================
--- lib/tsan/rtl/tsan_interceptors.cc
+++ lib/tsan/rtl/tsan_interceptors.cc
@@ -2475,6 +2475,42 @@
 #define TSAN_MAYBE_INTERCEPT__LWP_EXIT
 #endif
 
+#if SANITIZER_NETBSD
+// NetBSD uses indirection for old threading functions for historical reasons
+TSAN_INTERCEPTOR(void, __libc_cond_init, void *c, void *a) \
+  ALIAS(WRAPPER_NAME(pthread_cond_init));
+TSAN_INTERCEPTOR(void, __libc_cond_signal, void *c) \
+  ALIAS(WRAPPER_NAME(pthread_cond_signal));
+TSAN_INTERCEPTOR(void, __libc_cond_broadcast, void *c) \
+  ALIAS(WRAPPER_NAME(pthread_cond_broadcast));
+TSAN_INTERCEPTOR(void, __libc_cond_wait, void *c, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_cond_wait));
+TSAN_INTERCEPTOR(void, __libc_cond_destroy, void *c) \
+  ALIAS(WRAPPER_NAME(pthread_cond_destroy));
+TSAN_INTERCEPTOR(void, __libc_mutex_init, void *m, void *a) \
+  ALIAS(WRAPPER_NAME(pthread_mutex_init));
+TSAN_INTERCEPTOR(void, __libc_mutex_destroy, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_mutex_destroy));
+TSAN_INTERCEPTOR(void, __libc_mutex_trylock, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_mutex_trylock));
+TSAN_INTERCEPTOR(void, __libc_rwlock_init, void *m, void *a) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_init));
+TSAN_INTERCEPTOR(void, __libc_rwlock_destroy, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_destroy));
+TSAN_INTERCEPTOR(void, __libc_rwlock_rdlock, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_rdlock));
+TSAN_INTERCEPTOR(void, __libc_rwlock_tryrdlock, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_tryrdlock));
+TSAN_INTERCEPTOR(void, __libc_rwlock_wrlock, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_wrlock));
+TSAN_INTERCEPTOR(void, __libc_rwlock_trywrlock, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_trywrlock));
+TSAN_INTERCEPTOR(void, __libc_rwlock_unlock, void *m) \
+  ALIAS(WRAPPER_NAME(pthread_rwlock_unlock));
+TSAN_INTERCEPTOR(void, __libc_thr_once, void *o, void (*f)()) \
+  ALIAS(WRAPPER_NAME(pthread_once));
+#endif
+
 namespace __tsan {
 
 static void finalize(void *arg) {
@@ -2664,6 +2700,26 @@
   }
 #endif
 
+#if SANITIZE_NETBSD
+  // NetBSD uses indirection for old threading functions for historical reasons
+  TSAN_INTERCEPT(__libc_cond_init);
+  TSAN_INTERCEPT(__libc_cond_signal);
+  TSAN_INTERCEPT(__libc_cond_broadcast);
+  TSAN_INTERCEPT(__libc_cond_wait);
+  TSAN_INTERCEPT(__libc_cond_destroy);
+  TSAN_INTERCEPT(__libc_mutex_init);
+  TSAN_INTERCEPT(__libc_mutex_destroy);
+  TSAN_INTERCEPT(__libc_mutex_trylock);
+  TSAN_INTERCEPT(__libc_rwlock_init);
+  TSAN_INTERCEPT(__libc_rwlock_destroy);
+  TSAN_INTERCEPT(__libc_rwlock_rdlock);
+  TSAN_INTERCEPT(__libc_rwlock_tryrdlock);
+  TSAN_INTERCEPT(__libc_rwlock_wrlock);
+  TSAN_INTERCEPT(__libc_rwlock_trywrlock);
+  TSAN_INTERCEPT(__libc_rwlock_unlock);
+  TSAN_INTERCEPT(__libc_thr_once);
+#endif
+
   FdInit();
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40243.123568.patch
Type: text/x-patch
Size: 2920 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171120/8eb181a7/attachment.bin>


More information about the llvm-commits mailing list