msan_interceptors.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===-- msan_interceptors.cc ----------------------------------------------===// 278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// The LLVM Compiler Infrastructure 478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is distributed under the University of Illinois Open Source 678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// License. See LICENSE.TXT for details. 778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is a part of MemorySanitizer. 1178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Interceptors for standard library functions. 138530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// 148530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// FIXME: move as many interceptors as possible into 158530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// sanitizer_common/sanitizer_common_interceptors.h 1678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 1778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan.h" 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_chained_origin_depot.h" 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_origin.h" 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_thread.h" 229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include "sanitizer_common/sanitizer_platform_limits_posix.h" 2365199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany#include "sanitizer_common/sanitizer_allocator.h" 24cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov#include "sanitizer_common/sanitizer_allocator_internal.h" 25e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov#include "sanitizer_common/sanitizer_atomic.h" 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_common.h" 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_interception.h" 28887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov#include "sanitizer_common/sanitizer_stackdepot.h" 2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_libc.h" 30b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov#include "sanitizer_common/sanitizer_linux.h" 3178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <stdarg.h> 3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// ACHTUNG! No other system header includes in this file. 3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Ideally, we should get rid of stdarg.h as well. 3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan; 3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 38e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanovusing __sanitizer::memory_order; 39e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanovusing __sanitizer::atomic_load; 40e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanovusing __sanitizer::atomic_store; 41e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanovusing __sanitizer::atomic_uintptr_t; 42e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov 43447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov// True if this is a nested interceptor. 44447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanovstatic THREADLOCAL int in_interceptor_scope; 45447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" int *__errno_location(void); 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 48447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanovstruct InterceptorScope { 49447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov InterceptorScope() { ++in_interceptor_scope; } 50447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov ~InterceptorScope() { --in_interceptor_scope; } 51447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov}; 52447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 53447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanovbool IsInInterceptorScope() { 54447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov return in_interceptor_scope; 55447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov} 56447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 5778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define ENSURE_MSAN_INITED() do { \ 588028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov CHECK(!msan_init_is_running); \ 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { \ 6078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_init(); \ 6178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} while (0) 6378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 64447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov// Check that [x, x+n) range is unpoisoned. 65bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov#define CHECK_UNPOISONED_0(x, n) \ 66bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov do { \ 67bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov sptr offset = __msan_test_shadow(x, n); \ 68bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov if (__msan::IsInSymbolizer()) break; \ 69bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov if (offset >= 0 && __msan::flags()->report_umrs) { \ 70bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov GET_CALLER_PC_BP_SP; \ 71bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov (void) sp; \ 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ReportUMRInsideAddressRange(__func__, x, n, offset); \ 73bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov __msan::PrintWarningWithOrigin(pc, bp, \ 74bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov __msan_get_origin((char *)x + offset)); \ 75dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov if (__msan::flags()->halt_on_error) { \ 76bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov Printf("Exiting\n"); \ 77bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov Die(); \ 78bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov } \ 79bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov } \ 8078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } while (0) 8178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 82447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov// Check that [x, x+n) range is unpoisoned unless we are in a nested 83447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov// interceptor. 84341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#define CHECK_UNPOISONED(x, n) \ 85341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov do { \ 86341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (!IsInInterceptorScope()) CHECK_UNPOISONED_0(x, n); \ 87341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } while (0); 88447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 896afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memset(void *ptr, int c, SIZE_T n); 906afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memcpy(void *dst, const void *src, SIZE_T n); 9178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 926afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread, void *ptr, SIZE_T size, SIZE_T nmemb, void *file) { 9378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 946afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread)(ptr, size, nmemb, file); 9578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 9678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 9778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 9878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 9978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1006afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread_unlocked, void *ptr, SIZE_T size, SIZE_T nmemb, 10178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *file) { 10278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1036afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread_unlocked)(ptr, size, nmemb, file); 10478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 10578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 10678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 10778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 10878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1096afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, readlink, const char *path, char *buf, SIZE_T bufsiz) { 11078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1116afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(readlink)(path, buf, bufsiz); 11278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 11378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 11478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 11578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1176afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) { 11878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memcpy(dest, src, n); 11978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 12078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 121353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy StepanovINTERCEPTOR(void *, mempcpy, void *dest, const void *src, SIZE_T n) { 122353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov return (char *)__msan_memcpy(dest, src, n) + n; 123353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov} 124353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov 1255492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovINTERCEPTOR(void *, memccpy, void *dest, const void *src, int c, SIZE_T n) { 1265492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov ENSURE_MSAN_INITED(); 1275492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov void *res = REAL(memccpy)(dest, src, c, n); 1285492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov CHECK(!res || (res >= dest && res <= (char *)dest + n)); 1295492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov SIZE_T sz = res ? (char *)res - (char *)dest : n; 1305492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov CHECK_UNPOISONED(src, sz); 1315492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov __msan_unpoison(dest, sz); 1325492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov return res; 1335492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov} 1345492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov 1356afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memmove, void *dest, const void *src, SIZE_T n) { 13678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memmove(dest, src, n); 13778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 13878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1396afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memset, void *s, int c, SIZE_T n) { 14078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memset(s, c, n); 14178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 14278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 143ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(void *, bcopy, const void *src, void *dest, SIZE_T n) { 144ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return __msan_memmove(dest, src, n); 145ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 146ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1476afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(int, posix_memalign, void **memptr, SIZE_T alignment, SIZE_T size) { 14878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 14978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(alignment & (alignment - 1), 0); 15078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_NE(memptr, 0); 151b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov *memptr = MsanReallocate(&stack, 0, size, alignment, false); 152b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov CHECK_NE(*memptr, 0); 153b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov __msan_unpoison(memptr, sizeof(*memptr)); 15478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return 0; 15578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 15678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 15797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovINTERCEPTOR(void *, memalign, SIZE_T boundary, SIZE_T size) { 15897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 15997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov CHECK_EQ(boundary & (boundary - 1), 0); 16097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov void *ptr = MsanReallocate(&stack, 0, size, boundary, false); 16197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov return ptr; 16297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov} 16397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 1642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(void *, __libc_memalign, uptr align, uptr s) 1652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ALIAS(WRAPPER_NAME(memalign)); 1662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 16797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovINTERCEPTOR(void *, valloc, SIZE_T size) { 16897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 16997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov void *ptr = MsanReallocate(&stack, 0, size, GetPageSizeCached(), false); 17097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov return ptr; 17197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov} 17297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 17397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovINTERCEPTOR(void *, pvalloc, SIZE_T size) { 17497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 17597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov uptr PageSize = GetPageSizeCached(); 17697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov size = RoundUpTo(size, PageSize); 17797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov if (size == 0) { 17897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov // pvalloc(0) should allocate one page. 17997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov size = PageSize; 18097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov } 18197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov void *ptr = MsanReallocate(&stack, 0, size, PageSize, false); 18297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov return ptr; 18397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov} 18497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 18578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void, free, void *ptr) { 186effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 18778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (ptr == 0) return; 188effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov MsanDeallocate(&stack, ptr); 18978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 19078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(void, cfree, void *ptr) { 1922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_MALLOC_STACK_TRACE; 1932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (ptr == 0) return; 1942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanDeallocate(&stack, ptr); 1952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(uptr, malloc_usable_size, void *ptr) { 1982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return __msan_get_allocated_size(ptr); 1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This function actually returns a struct by value, but we can't unpoison a 2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// temporary! The following is equivalent on all supported platforms, and we 2032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// have a test to confirm that. 2042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(void, mallinfo, __sanitizer_mallinfo *sret) { 2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REAL(memset)(sret, 0, sizeof(*sret)); 2062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison(sret, sizeof(*sret)); 2072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(int, mallopt, int cmd, int value) { 2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return -1; 2112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(void, malloc_stats, void) { 2142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // FIXME: implement, but don't call REAL(malloc_stats)! 2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2176afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strlen, const char *s) { 21878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2196afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strlen)(s); 22078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, res + 1); 22178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 22278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 22378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2246afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strnlen, const char *s, SIZE_T n) { 22578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2266afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strnlen)(s, n); 2276afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T scan_size = (res == n) ? res : res + 1; 22878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, scan_size); 22978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 23078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 23178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 23278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: Add stricter shadow checks in str* interceptors (ex.: strcpy should 23378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// check the shadow of the terminating \0 byte). 23478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 23578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcpy, char *dest, const char *src) { // NOLINT 23678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2386afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 23978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcpy)(dest, src); // NOLINT 2402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, n + 1, &stack); 24178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 24278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 24378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2446afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncpy, char *dest, const char *src, SIZE_T n) { // NOLINT 24578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2476afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strnlen)(src, n); 24878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 24978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 25078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncpy)(dest, src, n); // NOLINT 2512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, copy_size, &stack); 25278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 25378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 25478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2554bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy StepanovINTERCEPTOR(char *, stpcpy, char *dest, const char *src) { // NOLINT 2564bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov ENSURE_MSAN_INITED(); 2572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2584bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov SIZE_T n = REAL(strlen)(src); 2594bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov char *res = REAL(stpcpy)(dest, src); // NOLINT 2602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, n + 1, &stack); 2614bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov return res; 2624bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov} 2634bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov 26478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strdup, char *src) { 26578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2676afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 26878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strdup)(src); 2692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(res, src, n + 1, &stack); 27078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 27178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 27278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2738aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovINTERCEPTOR(char *, __strdup, char *src) { 2748aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov ENSURE_MSAN_INITED(); 2752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2768aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov SIZE_T n = REAL(strlen)(src); 2778aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *res = REAL(__strdup)(src); 2782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(res, src, n + 1, &stack); 2798aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov return res; 2808aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 2818aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 2828aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovINTERCEPTOR(char *, strndup, char *src, SIZE_T n) { 2838aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov ENSURE_MSAN_INITED(); 2842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2858aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov SIZE_T copy_size = REAL(strnlen)(src, n); 2868aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *res = REAL(strndup)(src, n); 2872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(res, src, copy_size, &stack); 2888aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_unpoison(res + copy_size, 1); // \0 2898aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov return res; 2908aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 2918aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 2928aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovINTERCEPTOR(char *, __strndup, char *src, SIZE_T n) { 2938aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov ENSURE_MSAN_INITED(); 2942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 2958aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov SIZE_T copy_size = REAL(strnlen)(src, n); 2968aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *res = REAL(__strndup)(src, n); 2972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(res, src, copy_size, &stack); 2988aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_unpoison(res + copy_size, 1); // \0 2998aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov return res; 3008aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 3018aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 3026afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, gcvt, double number, SIZE_T ndigit, char *buf) { 30378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 30478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(gcvt)(number, ndigit, buf); 30578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // DynamoRio tool will take care of unpoisoning gcvt result for us. 30678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 3076afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(buf); 30878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, n + 1); 30978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 31078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 31178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 31278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 31378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcat, char *dest, const char *src) { // NOLINT 31478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 3166afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T src_size = REAL(strlen)(src); 3176afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 31878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcat)(dest, src); // NOLINT 3192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest + dest_size, src, src_size + 1, &stack); 32078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 32178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 32278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3236afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncat, char *dest, const char *src, SIZE_T n) { // NOLINT 32478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 3266afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 3272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SIZE_T copy_size = REAL(strnlen)(src, n); 32878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncat)(dest, src, n); // NOLINT 3292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest + dest_size, src, copy_size, &stack); 3302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison(dest + dest_size + copy_size, 1); // \0 33178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 33278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 33378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Hack: always pass nptr and endptr as part of __VA_ARGS_ to avoid having to 3352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// deal with empty __VA_ARGS__ in the case of INTERCEPTOR_STRTO. 3362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define INTERCEPTOR_STRTO_BODY(ret_type, func, ...) \ 3372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ENSURE_MSAN_INITED(); \ 3382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ret_type res = REAL(func)(__VA_ARGS__); \ 3392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!__msan_has_dynamic_component()) { \ 3402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison(endptr, sizeof(*endptr)); \ 3412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } \ 34278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 34378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define INTERCEPTOR_STRTO(ret_type, func) \ 3452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR(ret_type, func, const char *nptr, char **endptr) { \ 3462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRTO_BODY(ret_type, func, nptr, endptr); \ 34778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 34878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define INTERCEPTOR_STRTO_BASE(ret_type, func) \ 3502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR(ret_type, func, const char *nptr, char **endptr, int base) { \ 3512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRTO_BODY(ret_type, func, nptr, endptr, base); \ 35278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 35378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define INTERCEPTOR_STRTO_LOC(ret_type, func) \ 3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR(ret_type, func, const char *nptr, char **endptr, void *loc) { \ 3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRTO_BODY(ret_type, func, nptr, endptr, loc); \ 35778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 35878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define INTERCEPTOR_STRTO_BASE_LOC(ret_type, func) \ 3602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR(ret_type, func, const char *nptr, char **endptr, int base, \ 3612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *loc) { \ 3622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRTO_BODY(ret_type, func, nptr, endptr, base, loc); \ 363e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 364e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 3652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO(double, strtod) // NOLINT 3662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO(float, strtof) // NOLINT 3672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO(long double, strtold) // NOLINT 3682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE(long, strtol) // NOLINT 3692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE(long long, strtoll) // NOLINT 3702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE(unsigned long, strtoul) // NOLINT 3712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE(unsigned long long, strtoull) // NOLINT 3722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_LOC(double, strtod_l) // NOLINT 3732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_LOC(double, __strtod_l) // NOLINT 3742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_LOC(float, strtof_l) // NOLINT 3752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_LOC(float, __strtof_l) // NOLINT 3762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_LOC(long double, strtold_l) // NOLINT 3772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_LOC(long double, __strtold_l) // NOLINT 3782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE_LOC(long, strtol_l) // NOLINT 3792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE_LOC(long long, strtoll_l) // NOLINT 3802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE_LOC(unsigned long, strtoul_l) // NOLINT 3812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_STRTO_BASE_LOC(unsigned long long, strtoull_l) // NOLINT 3822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// FIXME: support *wprintf in common format interceptors. 3842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(int, vswprintf, void *str, uptr size, void *format, va_list ap) { 3850797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov ENSURE_MSAN_INITED(); 3862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = REAL(vswprintf)(str, size, format, ap); 3870797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov if (res >= 0 && !__msan_has_dynamic_component()) { 3882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison(str, 4 * (res + 1)); 3890797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov } 3900797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov return res; 3910797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov} 3920797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov 3932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) { 3940797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov ENSURE_MSAN_INITED(); 3950797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov va_list ap; 3960797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov va_start(ap, format); 3972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = vswprintf(str, size, format, ap); 3980797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov va_end(ap); 3990797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov return res; 4000797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov} 4010797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov 4022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, strxfrm, char *dest, const char *src, SIZE_T n) { 40378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 4042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_UNPOISONED(src, REAL(strlen)(src) + 1); 4052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SIZE_T res = REAL(strxfrm)(dest, src, n); 4062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (res < n) __msan_unpoison(dest, res + 1); 40778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 40878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 40978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, strxfrm_l, char *dest, const char *src, SIZE_T n, 4112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *loc) { 41278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 4132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_UNPOISONED(src, REAL(strlen)(src) + 1); 4142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SIZE_T res = REAL(strxfrm_l)(dest, src, n, loc); 4152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (res < n) __msan_unpoison(dest, res + 1); 41678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 41778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 41878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define INTERCEPTOR_STRFTIME_BODY(char_type, ret_type, func, s, ...) \ 4202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ENSURE_MSAN_INITED(); \ 4212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ret_type res = REAL(func)(s, __VA_ARGS__); \ 4222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (s) __msan_unpoison(s, sizeof(char_type) * (res + 1)); \ 42378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 42478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, strftime, char *s, SIZE_T max, const char *format, 4262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_tm *tm) { 4272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRFTIME_BODY(char, SIZE_T, strftime, s, max, format, tm); 42878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 42978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, strftime_l, char *s, SIZE_T max, const char *format, 4312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_tm *tm, void *loc) { 4322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRFTIME_BODY(char, SIZE_T, strftime_l, s, max, format, tm, loc); 43378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 43478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, __strftime_l, char *s, SIZE_T max, const char *format, 4362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_tm *tm, void *loc) { 4372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRFTIME_BODY(char, SIZE_T, __strftime_l, s, max, format, tm, 4382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines loc); 43978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 44078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, wcsftime, wchar_t *s, SIZE_T max, const wchar_t *format, 442e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov __sanitizer_tm *tm) { 4432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRFTIME_BODY(wchar_t, SIZE_T, wcsftime, s, max, format, tm); 4442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, wcsftime_l, wchar_t *s, SIZE_T max, const wchar_t *format, 4472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_tm *tm, void *loc) { 4482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRFTIME_BODY(wchar_t, SIZE_T, wcsftime_l, s, max, format, tm, 4492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines loc); 4502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(SIZE_T, __wcsftime_l, wchar_t *s, SIZE_T max, const wchar_t *format, 4532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_tm *tm, void *loc) { 4542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPTOR_STRFTIME_BODY(wchar_t, SIZE_T, __wcsftime_l, s, max, format, tm, 4552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines loc); 45678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 45778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 458801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovINTERCEPTOR(int, mbtowc, wchar_t *dest, const char *src, SIZE_T n) { 459801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov ENSURE_MSAN_INITED(); 460801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov int res = REAL(mbtowc)(dest, src, n); 461801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov if (res != -1 && dest) __msan_unpoison(dest, sizeof(wchar_t)); 462801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov return res; 463801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 464801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 465801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovINTERCEPTOR(int, mbrtowc, wchar_t *dest, const char *src, SIZE_T n, void *ps) { 466801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov ENSURE_MSAN_INITED(); 467801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov SIZE_T res = REAL(mbrtowc)(dest, src, n, ps); 468801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov if (res != (SIZE_T)-1 && dest) __msan_unpoison(dest, sizeof(wchar_t)); 469801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov return res; 470801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 471801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 4726afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) { 47378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 4746afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcslen)(s); 47578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, sizeof(wchar_t) * (res + 1)); 47678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 47778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 47878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 47978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcschr(const wchar_t *wcs, wchar_t wc); 48078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcschr, void *s, wchar_t wc, void *ps) { 48178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 48278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcschr)(s, wc, ps); 48378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 48478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 48578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 48678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcscpy(wchar_t *dest, const wchar_t *src); 48778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcscpy, wchar_t *dest, const wchar_t *src) { 48878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 4892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 49078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcscpy)(dest, src); 4912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, sizeof(wchar_t) * (REAL(wcslen)(src) + 1), &stack); 49278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 49378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 49478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4956afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, SIZE_T n); 4966afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { 49778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 4982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 49978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemcpy)(dest, src, n); 5002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, n * sizeof(wchar_t), &stack); 50178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 50278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 504353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy StepanovINTERCEPTOR(wchar_t *, wmempcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { 505353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov ENSURE_MSAN_INITED(); 5062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 507353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov wchar_t *res = REAL(wmempcpy)(dest, src, n); 5082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, n * sizeof(wchar_t), &stack); 509353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov return res; 510353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov} 511353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov 5126afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemset, wchar_t *s, wchar_t c, SIZE_T n) { 51378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(MEM_IS_APP(s)); 51478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 51578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = (wchar_t *)fast_memset(s, c, n * sizeof(wchar_t)); 51678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n * sizeof(wchar_t)); 51778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 51878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 51978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5206afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemmove, wchar_t *dest, const wchar_t *src, SIZE_T n) { 52178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 5222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 52378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemmove)(dest, src, n); 5242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MovePoison(dest, src, n * sizeof(wchar_t), &stack); 52578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 52678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 52778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 52878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wcscmp, const wchar_t *s1, const wchar_t *s2) { 52978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 53078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wcscmp)(s1, s2); 53178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 53278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 53378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 53478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(double, wcstod, const wchar_t *nptr, wchar_t **endptr) { 53578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 53678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov double res = REAL(wcstod)(nptr, endptr); 53778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 53878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 53978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 54078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 54178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, gettimeofday, void *tv, void *tz) { 54278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 54378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(gettimeofday)(tv, tz); 54478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tv) 54578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tv, 16); 54678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tz) 54778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tz, 8); 54878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 54978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 55078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 55178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fcvt, double x, int a, int *b, int *c) { 55278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 55378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fcvt)(x, a, b, c); 55478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 55578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(b, sizeof(*b)); 55678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(c, sizeof(*c)); 55778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 55878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 55978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 56078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 56178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, getenv, char *name) { 56278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 56378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getenv)(name); 56478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 56578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 56678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, REAL(strlen)(res) + 1); 56778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 56878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 56978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 57078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 571534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanovextern char **environ; 572534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 573534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanovstatic void UnpoisonEnviron() { 574534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov char **envp = environ; 575534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov for (; *envp; ++envp) { 576534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov __msan_unpoison(envp, sizeof(*envp)); 577534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov __msan_unpoison(*envp, REAL(strlen)(*envp) + 1); 578534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov } 579534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov // Trailing NULL pointer. 580534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov __msan_unpoison(envp, sizeof(*envp)); 581534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov} 582534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 583534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovINTERCEPTOR(int, setenv, const char *name, const char *value, int overwrite) { 584534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov ENSURE_MSAN_INITED(); 585534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov int res = REAL(setenv)(name, value, overwrite); 586534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov if (!res) UnpoisonEnviron(); 587534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov return res; 588534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov} 589534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 590534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovINTERCEPTOR(int, putenv, char *string) { 591534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov ENSURE_MSAN_INITED(); 592534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov int res = REAL(putenv)(string); 593534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov if (!res) UnpoisonEnviron(); 594534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov return res; 595534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov} 596534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 59778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) { 59878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 59978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat)(magic, fd, buf); 60078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 60278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 60378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 60478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 60578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) { 60678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 60778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat64)(magic, fd, buf); 60878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 61078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 61178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 61278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 613bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy StepanovINTERCEPTOR(int, __fxstatat, int magic, int fd, char *pathname, void *buf, 614bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov int flags) { 615bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov ENSURE_MSAN_INITED(); 616bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov int res = REAL(__fxstatat)(magic, fd, pathname, buf, flags); 617bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov if (!res) __msan_unpoison(buf, __sanitizer::struct_stat_sz); 618bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov return res; 619bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov} 620bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov 621bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy StepanovINTERCEPTOR(int, __fxstatat64, int magic, int fd, char *pathname, void *buf, 622bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov int flags) { 623bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov ENSURE_MSAN_INITED(); 624bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov int res = REAL(__fxstatat64)(magic, fd, pathname, buf, flags); 625bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov if (!res) __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 626bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov return res; 627bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov} 628bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov 62978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat, int magic, char *path, void *buf) { 63078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 63178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat)(magic, path, buf); 63278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 63478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 63578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 63678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 63778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat64, int magic, char *path, void *buf) { 63878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 63978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat64)(magic, path, buf); 64078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6419358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 64278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 64378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 64478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 64578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat, int magic, char *path, void *buf) { 64678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 64778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat)(magic, path, buf); 64878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6499358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 65078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 65178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 65278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 65378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat64, int magic, char *path, void *buf) { 65478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 65578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat64)(magic, path, buf); 65678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 65878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 65978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 66078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 66178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, pipe, int pipefd[2]) { 66278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 66378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(pipe)(pipefd); 66478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 66578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(pipe)(pipefd); 66678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 66778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(pipefd, sizeof(int[2])); 66878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 66978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 67078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 671134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovINTERCEPTOR(int, pipe2, int pipefd[2], int flags) { 672134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov ENSURE_MSAN_INITED(); 673134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov int res = REAL(pipe2)(pipefd, flags); 674134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov if (!res) 675134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov __msan_unpoison(pipefd, sizeof(int[2])); 676134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov return res; 677134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov} 678134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov 679134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovINTERCEPTOR(int, socketpair, int domain, int type, int protocol, int sv[2]) { 680134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov ENSURE_MSAN_INITED(); 681134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov int res = REAL(socketpair)(domain, type, protocol, sv); 682134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov if (!res) 683134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov __msan_unpoison(sv, sizeof(int[2])); 684134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov return res; 685134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov} 686134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov 68778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets, char *s, int size, void *stream) { 68878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 68978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets)(s, size, stream); 69078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 69178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 69278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 69378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 69478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 69578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets_unlocked, char *s, int size, void *stream) { 69678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 69778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets_unlocked)(s, size, stream); 69878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 69978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 70078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 70178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 70278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 70378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit, int resource, void *rlim) { 70478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 70578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit)(resource, rlim); 70678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 70778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit)(resource, rlim); 70878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 7099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(rlim, __sanitizer::struct_rlimit_sz); 71078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 71178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 71278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 71378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit64, int resource, void *rlim) { 71478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 71578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit64)(resource, rlim); 71678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 71778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit64)(resource, rlim); 71878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 7199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(rlim, __sanitizer::struct_rlimit64_sz); 72078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 72178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 72278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 72378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, uname, void *utsname) { 72478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 72578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(uname)(utsname); 72678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) { 7279358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(utsname, __sanitizer::struct_utsname_sz); 72878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 72978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 73078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 73178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 73295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovINTERCEPTOR(int, gethostname, char *name, SIZE_T len) { 73395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov ENSURE_MSAN_INITED(); 73495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov int res = REAL(gethostname)(name, len); 73595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov if (!res) { 73695d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov SIZE_T real_len = REAL(strnlen)(name, len); 73795d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov if (real_len < len) 73895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov ++real_len; 73995d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov __msan_unpoison(name, real_len); 74095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov } 74195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov return res; 74295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov} 74395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov 74478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_wait, int epfd, void *events, int maxevents, 74578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout) { 74678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 74778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_wait)(epfd, events, maxevents, timeout); 74878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 7499358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); 75078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 75178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 75278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 75378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 75478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_pwait, int epfd, void *events, int maxevents, 75578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout, void *sigmask) { 75678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 75778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_pwait)(epfd, events, maxevents, timeout, sigmask); 75878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 7599358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); 76078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 76178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 76278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 76378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7646afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recv, int fd, void *buf, SIZE_T len, int flags) { 76578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 7666afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recv)(fd, buf, len, flags); 76778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 76878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 76978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 77078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 77178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7726afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags, 7739666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov void *srcaddr, int *addrlen) { 77478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 7757b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov SIZE_T srcaddr_sz; 7769666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (srcaddr) srcaddr_sz = *addrlen; 7776afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvfrom)(fd, buf, len, flags, srcaddr, addrlen); 7787b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (res > 0) { 77978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 7807b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) { 7819666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov SIZE_T sz = *addrlen; 7827b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz); 7837b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 7847b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 78578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 78678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 78778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7886afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, calloc, SIZE_T nmemb, SIZE_T size) { 789967e07eccfec5e013df5f77b7dd906abfa6b60d9Kostya Serebryany if (CallocShouldReturnNullDueToOverflow(size, nmemb)) 790967e07eccfec5e013df5f77b7dd906abfa6b60d9Kostya Serebryany return AllocatorReturnNull(); 79178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 79278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { 79378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym. 7946afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany const SIZE_T kCallocPoolSize = 1024; 79578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static uptr calloc_memory_for_dlsym[kCallocPoolSize]; 7966afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany static SIZE_T allocated; 7976afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize; 79878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *mem = (void*)&calloc_memory_for_dlsym[allocated]; 79978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov allocated += size_in_words; 80078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(allocated < kCallocPoolSize); 80178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return mem; 80278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 80378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, nmemb * size, sizeof(u64), true); 80478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 80578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8066afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, realloc, void *ptr, SIZE_T size) { 80778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 80878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, ptr, size, sizeof(u64), false); 80978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 81078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8116afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, malloc, SIZE_T size) { 81278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 81378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, size, sizeof(u64), false); 81478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 81578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 81611347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_allocated_memory(const void* data, uptr size) { 817887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 818887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov if (flags()->poison_in_malloc) 819887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov __msan_poison(data, size); 820887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov if (__msan_get_track_origins()) { 821887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov u32 stack_id = StackDepotPut(stack.trace, stack.size); 8222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 id; 8232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ChainedOriginDepotPut(stack_id, Origin::kHeapRoot, &id); 8242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(data, size, Origin(id, 1).raw_id()); 825887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov } 826887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov} 827887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov 8286afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap, void *addr, SIZE_T length, int prot, int flags, 8296afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF_T offset) { 83078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 8312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (addr && !MEM_IS_APP(addr)) { 8322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (flags & map_fixed) { 8332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *__errno_location() = errno_EINVAL; 8342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return (void *)-1; 8352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 8362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines addr = 0; 8372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 8382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 83978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap)(addr, length, prot, flags, fd, offset); 84078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 84178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 84278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 84378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 84478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8456afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap64, void *addr, SIZE_T length, int prot, int flags, 8466afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF64_T offset) { 84778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 8482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (addr && !MEM_IS_APP(addr)) { 8492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (flags & map_fixed) { 8502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *__errno_location() = errno_EINVAL; 8512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return (void *)-1; 8522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 8532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines addr = 0; 8542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 8552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 85678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap64)(addr, length, prot, flags, fd, offset); 85778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 85878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 85978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 86078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 86178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 862e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstruct dlinfo { 863e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_fname; 864e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_fbase; 865e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_sname; 866e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_saddr; 867e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}; 868e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 869e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, dladdr, void *addr, dlinfo *info) { 870e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 871e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(dladdr)(addr, info); 872e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res != 0) { 873e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info, sizeof(*info)); 874e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_fname) 875e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_fname, REAL(strlen)(info->dli_fname) + 1); 876e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_sname) 877e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_sname, REAL(strlen)(info->dli_sname) + 1); 878e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 879e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 880e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 881e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 8822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(char *, dlerror, int fake) { 883ae7db43b4e8341c0f1c3166ffcf2b7c2aa7391f7Evgeniy Stepanov ENSURE_MSAN_INITED(); 8842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *res = REAL(dlerror)(fake); 885ae7db43b4e8341c0f1c3166ffcf2b7c2aa7391f7Evgeniy Stepanov if (res != 0) __msan_unpoison(res, REAL(strlen)(res) + 1); 886ae7db43b4e8341c0f1c3166ffcf2b7c2aa7391f7Evgeniy Stepanov return res; 887ae7db43b4e8341c0f1c3166ffcf2b7c2aa7391f7Evgeniy Stepanov} 888ae7db43b4e8341c0f1c3166ffcf2b7c2aa7391f7Evgeniy Stepanov 8891aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanovtypedef int (*dl_iterate_phdr_cb)(__sanitizer_dl_phdr_info *info, SIZE_T size, 8901aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov void *data); 8912bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanovstruct dl_iterate_phdr_data { 8922bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov dl_iterate_phdr_cb callback; 8932bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov void *data; 8942bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}; 8952bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov 8961aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanovstatic int msan_dl_iterate_phdr_cb(__sanitizer_dl_phdr_info *info, SIZE_T size, 8971aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov void *data) { 8981aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov if (info) { 8992bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov __msan_unpoison(info, size); 9001aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov if (info->dlpi_name) 9011aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov __msan_unpoison(info->dlpi_name, REAL(strlen)(info->dlpi_name) + 1); 9021aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov } 9032bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov dl_iterate_phdr_data *cbdata = (dl_iterate_phdr_data *)data; 904c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov UnpoisonParam(3); 9052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return IndirectExternCall(cbdata->callback)(info, size, cbdata->data); 9062bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov} 9072bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov 9082bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy StepanovINTERCEPTOR(int, dl_iterate_phdr, dl_iterate_phdr_cb callback, void *data) { 9092bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov ENSURE_MSAN_INITED(); 9102bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EnterLoader(); 9112bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov dl_iterate_phdr_data cbdata; 9122bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov cbdata.callback = callback; 9132bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov cbdata.data = data; 9142bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov int res = REAL(dl_iterate_phdr)(msan_dl_iterate_phdr_cb, (void *)&cbdata); 9152bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov ExitLoader(); 9162bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov return res; 9172bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov} 9182bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov 919e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, getrusage, int who, void *usage) { 920e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 921e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(getrusage)(who, usage); 922e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res == 0) { 9239358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(usage, __sanitizer::struct_rusage_sz); 924e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 925e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 926e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 927e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 9282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesclass SignalHandlerScope { 9292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines public: 9302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SignalHandlerScope() { 9312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (MsanThread *t = GetCurrentThread()) 9322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines t->EnterSignalHandler(); 9332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 9342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ~SignalHandlerScope() { 9352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (MsanThread *t = GetCurrentThread()) 9362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines t->LeaveSignalHandler(); 9372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 9382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 9392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 940e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov// sigactions_mu guarantees atomicity of sigaction() and signal() calls. 941e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov// Access to sigactions[] is gone with relaxed atomics to avoid data race with 942e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov// the signal handler. 94306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovconst int kMaxSignals = 1024; 944e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanovstatic atomic_uintptr_t sigactions[kMaxSignals]; 94506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic StaticSpinMutex sigactions_mu; 94606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 94706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic void SignalHandler(int signo) { 9482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SignalHandlerScope signal_handler_scope; 9490e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov ScopedThreadLocalStateBackup stlsb; 95091659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov UnpoisonParam(1); 95191659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov 952a27bdf70ca24202dce21cf7c1a387aeaa400d889Kostya Serebryany typedef void (*signal_cb)(int x); 953e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov signal_cb cb = 954e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov (signal_cb)atomic_load(&sigactions[signo], memory_order_relaxed); 9552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines IndirectExternCall(cb)(signo); 95606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} 95706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 95806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic void SignalAction(int signo, void *si, void *uc) { 9592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SignalHandlerScope signal_handler_scope; 9600e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov ScopedThreadLocalStateBackup stlsb; 961c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov UnpoisonParam(3); 962b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov __msan_unpoison(si, sizeof(__sanitizer_sigaction)); 963072770202bb1002172abe9a4b1eeb7f2d2fb004fEvgeniy Stepanov __msan_unpoison(uc, __sanitizer::ucontext_t_sz); 96406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 96506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov typedef void (*sigaction_cb)(int, void *, void *); 966e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov sigaction_cb cb = 967e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov (sigaction_cb)atomic_load(&sigactions[signo], memory_order_relaxed); 9682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines IndirectExternCall(cb)(signo, si, uc); 96906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} 97006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 97106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovINTERCEPTOR(int, sigaction, int signo, const __sanitizer_sigaction *act, 97206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov __sanitizer_sigaction *oldact) { 973e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov ENSURE_MSAN_INITED(); 974583025ddc52988cdcedb5dee57e0d66a0c586340Kostya Serebryany // FIXME: check that *act is unpoisoned. 975e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov // That requires intercepting all of sigemptyset, sigfillset, etc. 976a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov int res; 977a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov if (flags()->wrap_signals) { 978a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov SpinMutexLock lock(&sigactions_mu); 979a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov CHECK_LT(signo, kMaxSignals); 980e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov uptr old_cb = atomic_load(&sigactions[signo], memory_order_relaxed); 981a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov __sanitizer_sigaction new_act; 982a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov __sanitizer_sigaction *pnew_act = act ? &new_act : 0; 983a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov if (act) { 984b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov internal_memcpy(pnew_act, act, sizeof(__sanitizer_sigaction)); 9852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr cb = (uptr)pnew_act->sigaction; 986b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov uptr new_cb = (pnew_act->sa_flags & __sanitizer::sa_siginfo) 987b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov ? (uptr)SignalAction 988b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov : (uptr)SignalHandler; 989a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov if (cb != __sanitizer::sig_ign && cb != __sanitizer::sig_dfl) { 990e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov atomic_store(&sigactions[signo], cb, memory_order_relaxed); 9912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pnew_act->sigaction = (void (*)(int, void *, void *))new_cb; 992a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov } 99306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 994a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov res = REAL(sigaction)(signo, pnew_act, oldact); 995a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov if (res == 0 && oldact) { 9962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr cb = (uptr)oldact->sigaction; 997cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov if (cb != __sanitizer::sig_ign && cb != __sanitizer::sig_dfl) { 9982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines oldact->sigaction = (void (*)(int, void *, void *))old_cb; 999cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov } 1000a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov } 1001a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov } else { 1002a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov res = REAL(sigaction)(signo, act, oldact); 100306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 1004a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov 100506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov if (res == 0 && oldact) { 1006b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov __msan_unpoison(oldact, sizeof(__sanitizer_sigaction)); 1007e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 1008e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 1009e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 1010e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 101106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovINTERCEPTOR(int, signal, int signo, uptr cb) { 101206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov ENSURE_MSAN_INITED(); 1013a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov if (flags()->wrap_signals) { 1014a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov CHECK_LT(signo, kMaxSignals); 1015a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov SpinMutexLock lock(&sigactions_mu); 1016a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov if (cb != __sanitizer::sig_ign && cb != __sanitizer::sig_dfl) { 1017e0a871284c7496b91add2956531d1a9e65b7bc88Evgeniy Stepanov atomic_store(&sigactions[signo], cb, memory_order_relaxed); 1018a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov cb = (uptr) SignalHandler; 1019a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov } 1020a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov return REAL(signal)(signo, cb); 1021a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov } else { 1022a213ab66e1c743ec7a52af4a49ec6c126cc245aeEvgeniy Stepanov return REAL(signal)(signo, cb); 102306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 102406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} 102506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 102610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanovextern "C" int pthread_attr_init(void *attr); 102710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanovextern "C" int pthread_attr_destroy(void *attr); 10287c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov 10297c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanovstatic void *MsanThreadStartFunc(void *arg) { 10302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanThread *t = (MsanThread *)arg; 10312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SetCurrentThread(t); 10322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return t->ThreadStart(); 10337c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov} 103410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 103510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovINTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), 103610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov void * param) { 103710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ENSURE_MSAN_INITED(); // for GetTlsSize() 103810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov __sanitizer_pthread_attr_t myattr; 103910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov if (attr == 0) { 104010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov pthread_attr_init(&myattr); 104110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov attr = &myattr; 104210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov } 1043b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov 10442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AdjustStackSize(attr); 104510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 10462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanThread *t = MsanThread::Create(callback, param); 10477c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov 10482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = REAL(pthread_create)(th, attr, MsanThreadStartFunc, t); 10497c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov 105010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov if (attr == &myattr) 105110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov pthread_attr_destroy(&myattr); 1052e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 1053e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov __msan_unpoison(th, __sanitizer::pthread_t_sz); 1054e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 105510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov return res; 105610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov} 105710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 1058eaca82cf249021afa31dbc970278f2f28ea2a1aaTimur IskhodzhanovINTERCEPTOR(int, pthread_key_create, __sanitizer_pthread_key_t *key, 1059eaca82cf249021afa31dbc970278f2f28ea2a1aaTimur Iskhodzhanov void (*dtor)(void *value)) { 10602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (msan_init_is_running) return REAL(pthread_key_create)(key, dtor); 1061737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov ENSURE_MSAN_INITED(); 1062737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov int res = REAL(pthread_key_create)(key, dtor); 1063737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov if (!res && key) 1064737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov __msan_unpoison(key, sizeof(*key)); 1065737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov return res; 1066737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov} 1067737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov 10686567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy StepanovINTERCEPTOR(int, pthread_join, void *th, void **retval) { 10696567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov ENSURE_MSAN_INITED(); 10706567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov int res = REAL(pthread_join)(th, retval); 10716567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov if (!res && retval) 10726567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov __msan_unpoison(retval, sizeof(*retval)); 10736567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov return res; 10746567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov} 10756567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov 10767b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanovextern char *tzname[2]; 10777b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov 10782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR(void, tzset, int fake) { 10797b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov ENSURE_MSAN_INITED(); 10802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REAL(tzset)(fake); 10817b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov if (tzname[0]) 10827b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov __msan_unpoison(tzname[0], REAL(strlen)(tzname[0]) + 1); 10837b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov if (tzname[1]) 10847b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov __msan_unpoison(tzname[1], REAL(strlen)(tzname[1]) + 1); 10857b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov return; 10867b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov} 10877b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov 1088cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanovstruct MSanAtExitRecord { 1089cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov void (*func)(void *arg); 1090cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov void *arg; 1091cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov}; 1092cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov 1093cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanovvoid MSanAtExitWrapper(void *arg) { 1094cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov UnpoisonParam(1); 1095cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov MSanAtExitRecord *r = (MSanAtExitRecord *)arg; 10962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines IndirectExternCall(r->func)(r->arg); 1097cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov InternalFree(r); 1098cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov} 1099cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov 1100cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov// Unpoison argument shadow for C++ module destructors. 1101cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy StepanovINTERCEPTOR(int, __cxa_atexit, void (*func)(void *), void *arg, 1102cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov void *dso_handle) { 1103cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov if (msan_init_is_running) return REAL(__cxa_atexit)(func, arg, dso_handle); 1104cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov ENSURE_MSAN_INITED(); 1105cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov MSanAtExitRecord *r = 1106cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov (MSanAtExitRecord *)InternalAlloc(sizeof(MSanAtExitRecord)); 1107cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov r->func = func; 1108cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov r->arg = arg; 1109cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov return REAL(__cxa_atexit)(MSanAtExitWrapper, r, dso_handle); 1110cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov} 1111cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov 1112f3603890015c130420def39d67a02c2fdafc6f84Evgeniy StepanovDECLARE_REAL(int, shmctl, int shmid, int cmd, void *buf) 1113f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1114f3603890015c130420def39d67a02c2fdafc6f84Evgeniy StepanovINTERCEPTOR(void *, shmat, int shmid, const void *shmaddr, int shmflg) { 1115f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ENSURE_MSAN_INITED(); 1116f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov void *p = REAL(shmat)(shmid, shmaddr, shmflg); 1117f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov if (p != (void *)-1) { 1118f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov __sanitizer_shmid_ds ds; 1119f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov int res = REAL(shmctl)(shmid, shmctl_ipc_stat, &ds); 1120f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov if (!res) { 1121f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov __msan_unpoison(p, ds.shm_segsz); 1122f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov } 1123f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov } 1124f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov return p; 1125f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov} 1126f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1127548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov// Linux kernel has a bug that leads to kernel deadlock if a process 1128548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov// maps TBs of memory and then calls mlock(). 1129548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanovstatic void MlockIsUnsupported() { 1130548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov static atomic_uint8_t printed; 1131548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov if (atomic_exchange(&printed, 1, memory_order_relaxed)) 1132548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov return; 11332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VPrintf(1, 11342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "INFO: MemorySanitizer ignores mlock/mlockall/munlock/munlockall\n"); 1135548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov} 1136548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov 1137548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovINTERCEPTOR(int, mlock, const void *addr, uptr len) { 1138548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov MlockIsUnsupported(); 1139548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov return 0; 1140548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov} 1141548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov 1142548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovINTERCEPTOR(int, munlock, const void *addr, uptr len) { 1143548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov MlockIsUnsupported(); 1144548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov return 0; 1145548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov} 1146548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov 1147548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovINTERCEPTOR(int, mlockall, int flags) { 1148548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov MlockIsUnsupported(); 1149548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov return 0; 1150548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov} 1151548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov 1152548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovINTERCEPTOR(int, munlockall, void) { 1153548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov MlockIsUnsupported(); 1154548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov return 0; 1155548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov} 1156f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1157447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanovstruct MSanInterceptorContext { 1158447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov bool in_interceptor_scope; 1159447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov}; 1160447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 11618cde99fb9df913aaf7c1715cd134110dd5a15834Dmitry Vyukovnamespace __msan { 11628cde99fb9df913aaf7c1715cd134110dd5a15834Dmitry Vyukov 11638cde99fb9df913aaf7c1715cd134110dd5a15834Dmitry Vyukovint OnExit() { 116414dd980b384ad859099b499e12f320c4791fb674Dmitry Vyukov // FIXME: ask frontend whether we need to return failure. 116514dd980b384ad859099b499e12f320c4791fb674Dmitry Vyukov return 0; 116614dd980b384ad859099b499e12f320c4791fb674Dmitry Vyukov} 116714dd980b384ad859099b499e12f320c4791fb674Dmitry Vyukov 11688cde99fb9df913aaf7c1715cd134110dd5a15834Dmitry Vyukov} // namespace __msan 11698cde99fb9df913aaf7c1715cd134110dd5a15834Dmitry Vyukov 1170a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov// A version of CHECK_UNPOISONED using a saved scope value. Used in common 11715b2afc3e655f32c8b9d4b7c8b0ad31681f16cf06Evgeniy Stepanov// interceptors. 1172341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#define CHECK_UNPOISONED_CTX(ctx, x, n) \ 1173341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov do { \ 1174341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (!((MSanInterceptorContext *)ctx)->in_interceptor_scope) \ 1175341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov CHECK_UNPOISONED_0(x, n); \ 1176341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } while (0) 1177447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 11782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define MSAN_INTERCEPT_FUNC(name) \ 11792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines do { \ 11802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if ((!INTERCEPT_FUNCTION(name) || !REAL(name))) \ 11812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VReport(1, "MemorySanitizer: failed to intercept '" #name "'\n"); \ 1182a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov } while (0) 1183a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov 1184a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov#define COMMON_INTERCEPT_FUNCTION(name) MSAN_INTERCEPT_FUNC(name) 11852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define COMMON_INTERCEPTOR_UNPOISON_PARAM(count) \ 11863fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov UnpoisonParam(count) 1187996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \ 1188447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov __msan_unpoison(ptr, size) 1189447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) \ 1190341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov CHECK_UNPOISONED_CTX(ctx, ptr, size) 11912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define COMMON_INTERCEPTOR_INITIALIZE_RANGE(ptr, size) \ 11920586dcc3e531d43dca6b5d226bac2d38b5ad64feDmitry Vyukov __msan_unpoison(ptr, size) 11931161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \ 11941161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov if (msan_init_is_running) return REAL(func)(__VA_ARGS__); \ 11951161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov MSanInterceptorContext msan_ctx = {IsInInterceptorScope()}; \ 11961161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov ctx = (void *)&msan_ctx; \ 11971161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov (void)ctx; \ 11981161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov InterceptorScope interceptor_scope; \ 11991161eb4bff61908074699f6459eabce25839f966Evgeniy Stepanov __msan_unpoison(__errno_location(), sizeof(int)); /* NOLINT */ \ 1200447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov ENSURE_MSAN_INITED(); 1201447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#define COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd) \ 1202447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov do { \ 120382a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov } while (false) 12049d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) \ 12059d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov do { \ 12069d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } while (false) 12079d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, newfd) \ 12089d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov do { \ 12099d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } while (false) 121082a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov#define COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, name) \ 12119d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov do { \ 12129d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } while (false) // FIXME 12135cf2c460e96e593b1c772f1b02d3a217f4837fdcDmitry Vyukov#define COMMON_INTERCEPTOR_SET_PTHREAD_NAME(ctx, thread, name) \ 12145cf2c460e96e593b1c772f1b02d3a217f4837fdcDmitry Vyukov do { \ 12155cf2c460e96e593b1c772f1b02d3a217f4837fdcDmitry Vyukov } while (false) // FIXME 1216e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define COMMON_INTERCEPTOR_BLOCK_REAL(name) REAL(name) 121714dd980b384ad859099b499e12f320c4791fb674Dmitry Vyukov#define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit() 12182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, map) \ 12192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!__msan_has_dynamic_component() && map) { \ 12202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines /* If msandr didn't clear the shadow before the initializers ran, we do */ \ 12212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines /* it ourselves afterwards. */ \ 12222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ForEachMappedRegion((link_map *)map, __msan_unpoison); \ 12232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 12242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 12254f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common/sanitizer_common_interceptors.inc" 1226c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 12272887a64cb7b82fc2dcbe4b1fcc33562077ec371aEvgeniy Stepanov#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) CHECK_UNPOISONED(p, s) 12286b85945cae8265323e98e4e88c0de66d462f69c6Alexey Samsonov#define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) \ 12296b85945cae8265323e98e4e88c0de66d462f69c6Alexey Samsonov do { \ 12306b85945cae8265323e98e4e88c0de66d462f69c6Alexey Samsonov } while (false) 12316b85945cae8265323e98e4e88c0de66d462f69c6Alexey Samsonov#define COMMON_SYSCALL_POST_READ_RANGE(p, s) \ 12326b85945cae8265323e98e4e88c0de66d462f69c6Alexey Samsonov do { \ 12336b85945cae8265323e98e4e88c0de66d462f69c6Alexey Samsonov } while (false) 12342887a64cb7b82fc2dcbe4b1fcc33562077ec371aEvgeniy Stepanov#define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) __msan_unpoison(p, s) 12352887a64cb7b82fc2dcbe4b1fcc33562077ec371aEvgeniy Stepanov#include "sanitizer_common/sanitizer_common_syscalls.inc" 12362887a64cb7b82fc2dcbe4b1fcc33562077ec371aEvgeniy Stepanov 123778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 12386afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memset(void *ptr, int c, SIZE_T n) { 123978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // hack until we have a really fast internal_memset 124078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 124178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 124278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)ptr % 8) == 0 && 124378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (c == 0 || c == -1)) { 124478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Printf("memset %p %zd %x\n", ptr, n, c); 124578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr to_store = c ? -1L : 0L; 124678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *p = (uptr*)ptr; 12476afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 124878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov p[i] = to_store; 124978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ptr; 125078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 125178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memset(ptr, c, n); 125278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 125378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 125478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 12556afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memcpy(void *dst, const void *src, SIZE_T n) { 125678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Same hack as in fast_memset above. 125778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 125878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 125978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)dst % 8) == 0 && 126078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)src % 8) == 0) { 126178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *d = (uptr*)dst; 126278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *s = (uptr*)src; 12636afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 126478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov d[i] = s[i]; 126578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return dst; 126678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 126778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memcpy(dst, src, n); 126878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 126978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 12702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void PoisonShadow(uptr ptr, uptr size, u8 value) { 12712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr PageSize = GetPageSizeCached(); 12722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr shadow_beg = MEM_TO_SHADOW(ptr); 12732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr shadow_end = MEM_TO_SHADOW(ptr + size); 12742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (value || 12752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines shadow_end - shadow_beg < common_flags()->clear_shadow_mmap_threshold) { 12762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fast_memset((void*)shadow_beg, value, shadow_end - shadow_beg); 12772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 12782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr page_beg = RoundUpTo(shadow_beg, PageSize); 12792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr page_end = RoundDownTo(shadow_end, PageSize); 12802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 12812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (page_beg >= page_end) { 12822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fast_memset((void *)shadow_beg, 0, shadow_end - shadow_beg); 12832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 12842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (page_beg != shadow_beg) { 12852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fast_memset((void *)shadow_beg, 0, page_beg - shadow_beg); 12862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 12872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (page_end != shadow_end) { 12882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fast_memset((void *)page_end, 0, shadow_end - page_end); 12892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 12902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MmapFixedNoReserve(page_beg, page_end - page_beg); 12912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 12922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 12932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 12942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 129578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// These interface functions reside here so that they can use 129678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// fast_memset, etc. 129711347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_unpoison(const void *a, uptr size) { 129878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 12992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PoisonShadow((uptr)a, size, 0); 130078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 130178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 130211347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_poison(const void *a, uptr size) { 130378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 13042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PoisonShadow((uptr)a, size, 13052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan::flags()->poison_heap_with_zeroes ? 0 : -1); 130678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 130778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 130878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison_stack(void *a, uptr size) { 130978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 13102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PoisonShadow((uptr)a, size, 13112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan::flags()->poison_stack_with_zeroes ? 0 : -1); 131278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 131378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 131478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_clear_and_unpoison(void *a, uptr size) { 131578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset(a, 0, size); 13162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PoisonShadow((uptr)a, size, 0); 13172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 13182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *__msan_memcpy(void *dest, const void *src, SIZE_T n) { 13202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!msan_inited) return internal_memcpy(dest, src, n); 13212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (msan_init_is_running) return REAL(memcpy)(dest, src, n); 13222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ENSURE_MSAN_INITED(); 13232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 13242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *res = fast_memcpy(dest, src, n); 13252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyPoison(dest, src, n, &stack); 13262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return res; 13272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 13282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *__msan_memset(void *s, int c, SIZE_T n) { 13302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!msan_inited) return internal_memset(s, c, n); 13312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (msan_init_is_running) return REAL(memset)(s, c, n); 13322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ENSURE_MSAN_INITED(); 13332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *res = fast_memset(s, c, n); 13342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison(s, n); 13352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return res; 133678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 133778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 13382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *__msan_memmove(void *dest, const void *src, SIZE_T n) { 13392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!msan_inited) return internal_memmove(dest, src, n); 13402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (msan_init_is_running) return REAL(memmove)(dest, src, n); 13412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ENSURE_MSAN_INITED(); 13422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE; 13432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *res = REAL(memmove)(dest, src, n); 13442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MovePoison(dest, src, n, &stack); 13452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return res; 13462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 13472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_unpoison_string(const char* s) { 13492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!MEM_IS_APP(s)) return; 13502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison(s, REAL(strlen)(s) + 1); 13512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 13522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesnamespace __msan { 13542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesu32 GetOriginIfPoisoned(uptr addr, uptr size) { 13562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned char *s = (unsigned char *)MEM_TO_SHADOW(addr); 1357450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov for (uptr i = 0; i < size; ++i) 1358450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov if (s[i]) 13594197fa23ada9682343a15b68dde08c0249db172aEvgeniy Stepanov return *(u32 *)SHADOW_TO_ORIGIN((s + i) & ~3UL); 1360450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov return 0; 1361450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov} 1362450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 13632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid SetOriginIfPoisoned(uptr addr, uptr src_shadow, uptr size, 13642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 src_origin) { 13652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr dst_s = MEM_TO_SHADOW(addr); 13662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr src_s = src_shadow; 13672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr src_s_end = src_s + size; 13682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (; src_s < src_s_end; ++dst_s, ++src_s) 13702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (*(u8 *)src_s) *(u32 *)SHADOW_TO_ORIGIN(dst_s &~3UL) = src_origin; 13712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 13722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 13732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid CopyOrigin(void *dst, const void *src, uptr size, StackTrace *stack) { 137478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_get_track_origins()) return; 137578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst) || !MEM_IS_APP(src)) return; 13762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1377450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov uptr d = (uptr)dst; 1378450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov uptr beg = d & ~3UL; 1379450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov // Copy left unaligned origin if that memory is poisoned. 1380450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov if (beg < d) { 13812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 o = GetOriginIfPoisoned(beg, d - beg); 13822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (o) { 13832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan_get_track_origins() > 1) o = ChainOrigin(o, stack); 13844197fa23ada9682343a15b68dde08c0249db172aEvgeniy Stepanov *(u32 *)MEM_TO_ORIGIN(beg) = o; 13852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 1386450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov beg += 4; 1387450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov } 1388450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 1389450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov uptr end = (d + size + 3) & ~3UL; 1390450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov // Copy right unaligned origin if that memory is poisoned. 1391450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov if (end > d + size) { 13922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 o = GetOriginIfPoisoned(d + size, end - d - size); 13932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (o) { 13942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan_get_track_origins() > 1) o = ChainOrigin(o, stack); 13954197fa23ada9682343a15b68dde08c0249db172aEvgeniy Stepanov *(u32 *)MEM_TO_ORIGIN(end - 4) = o; 13962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 1397450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov end -= 4; 1398450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov } 1399450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 1400450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov if (beg < end) { 1401450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov // Align src up. 1402450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov uptr s = ((uptr)src + 3) & ~3UL; 14032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // FIXME: factor out to msan_copy_origin_aligned 14042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan_get_track_origins() > 1) { 14052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 *src = (u32 *)MEM_TO_ORIGIN(s); 14062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 *src_s = (u32 *)MEM_TO_SHADOW(s); 14072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 *src_end = src + (end - beg); 14082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 *dst = (u32 *)MEM_TO_ORIGIN(beg); 14092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 src_o = 0; 14102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 dst_o = 0; 14112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (; src < src_end; ++src, ++src_s, ++dst) { 14122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!*src_s) continue; 14132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (*src != src_o) { 14142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines src_o = *src; 14152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dst_o = ChainOrigin(src_o, stack); 14162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 14172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *dst = dst_o; 14182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 14192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 14202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fast_memcpy((void *)MEM_TO_ORIGIN(beg), (void *)MEM_TO_ORIGIN(s), 14212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines end - beg); 14222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 1423450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov } 142478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 142578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 14262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid MovePoison(void *dst, const void *src, uptr size, StackTrace *stack) { 142778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 142878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 14292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (src == dst) return; 14302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines internal_memmove((void *)MEM_TO_SHADOW((uptr)dst), 14312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (void *)MEM_TO_SHADOW((uptr)src), size); 14322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyOrigin(dst, src, size, stack); 143378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 143478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 14352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid CopyPoison(void *dst, const void *src, uptr size, StackTrace *stack) { 143678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 143778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 14382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fast_memcpy((void *)MEM_TO_SHADOW((uptr)dst), 14392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (void *)MEM_TO_SHADOW((uptr)src), size); 14402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CopyOrigin(dst, src, size, stack); 144178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 144278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 144378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid InitializeInterceptors() { 144478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static int inited = 0; 144578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(inited, 0); 14462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines InitializeCommonInterceptors(); 1447c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 14488028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap); 14498028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap64); 14508028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(posix_memalign); 145197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov INTERCEPT_FUNCTION(memalign); 145297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov INTERCEPT_FUNCTION(valloc); 145397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov INTERCEPT_FUNCTION(pvalloc); 14548028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(malloc); 14558028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(calloc); 14568028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realloc); 14578028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(free); 14582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(cfree); 14592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(malloc_usable_size); 14602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(mallinfo); 14612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(mallopt); 14622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(malloc_stats); 14638028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread); 14648028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread_unlocked); 14658028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readlink); 14668028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memcpy); 14675492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov INTERCEPT_FUNCTION(memccpy); 1468353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov INTERCEPT_FUNCTION(mempcpy); 14698028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memset); 14708028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memmove); 1471ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(bcopy); 14728028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemset); 14738028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemcpy); 1474353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov INTERCEPT_FUNCTION(wmempcpy); 14758028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemmove); 14768028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcpy); // NOLINT 14774bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov INTERCEPT_FUNCTION(stpcpy); // NOLINT 14788028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strdup); 14798aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov INTERCEPT_FUNCTION(__strdup); 14808aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov INTERCEPT_FUNCTION(strndup); 14818aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov INTERCEPT_FUNCTION(__strndup); 14828028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncpy); // NOLINT 14838028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strlen); 14848028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strnlen); 14858028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gcvt); 14868028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcat); // NOLINT 14878028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncat); // NOLINT 14888028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtol); 14898028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoll); 14908028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoul); 14918028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoull); 1492e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtod); 14933f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov INTERCEPT_FUNCTION(strtod_l); 14943f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov INTERCEPT_FUNCTION(__strtod_l); 1495e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtof); 14963f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov INTERCEPT_FUNCTION(strtof_l); 14973f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov INTERCEPT_FUNCTION(__strtof_l); 1498e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtold); 14993f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov INTERCEPT_FUNCTION(strtold_l); 15003f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov INTERCEPT_FUNCTION(__strtold_l); 15012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strtol_l); 15022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strtoll_l); 15032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strtoul_l); 15042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strtoull_l); 15058028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vswprintf); 15068028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(swprintf); 15072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strxfrm); 15082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strxfrm_l); 15098028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strftime); 15102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(strftime_l); 15112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(__strftime_l); 15122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(wcsftime); 15132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(wcsftime_l); 15142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines INTERCEPT_FUNCTION(__wcsftime_l); 1515801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INTERCEPT_FUNCTION(mbtowc); 1516801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INTERCEPT_FUNCTION(mbrtowc); 15178028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcslen); 15188028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcschr); 15198028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscpy); 15208028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscmp); 15218028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstod); 15228028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getenv); 1523534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov INTERCEPT_FUNCTION(setenv); 1524534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov INTERCEPT_FUNCTION(putenv); 15258028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gettimeofday); 15268028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fcvt); 15278028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat); 1528bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov INTERCEPT_FUNCTION(__fxstatat); 15298028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat); 15308028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat); 15318028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat64); 1532bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov INTERCEPT_FUNCTION(__fxstatat64); 15338028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat64); 15348028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat64); 15358028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(pipe); 1536134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov INTERCEPT_FUNCTION(pipe2); 1537134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov INTERCEPT_FUNCTION(socketpair); 15388028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets); 15398028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets_unlocked); 15408028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit); 15418028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit64); 15428028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(uname); 154395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov INTERCEPT_FUNCTION(gethostname); 15448028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_wait); 15458028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_pwait); 15468028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recv); 15478028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvfrom); 1548e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(dladdr); 1549ae7db43b4e8341c0f1c3166ffcf2b7c2aa7391f7Evgeniy Stepanov INTERCEPT_FUNCTION(dlerror); 15502bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov INTERCEPT_FUNCTION(dl_iterate_phdr); 1551e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(getrusage); 1552e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(sigaction); 155306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov INTERCEPT_FUNCTION(signal); 155410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov INTERCEPT_FUNCTION(pthread_create); 1555737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov INTERCEPT_FUNCTION(pthread_key_create); 15566567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov INTERCEPT_FUNCTION(pthread_join); 15577b6360891accaccfc3520be601272e50372f786aEvgeniy Stepanov INTERCEPT_FUNCTION(tzset); 1558cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov INTERCEPT_FUNCTION(__cxa_atexit); 1559f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov INTERCEPT_FUNCTION(shmat); 15607c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov 156178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov inited = 1; 156278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 156378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} // namespace __msan 1564