msan_interceptors.cc revision 6c503b9c7b0ad08fba74dbed309447d75de9a157
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 "interception/interception.h" 1978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan.h" 209358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include "sanitizer_common/sanitizer_platform_limits_posix.h" 2165199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany#include "sanitizer_common/sanitizer_allocator.h" 2278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_common.h" 23887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov#include "sanitizer_common/sanitizer_stackdepot.h" 2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_libc.h" 25b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov#include "sanitizer_common/sanitizer_linux.h" 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <stdarg.h> 2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// ACHTUNG! No other system header includes in this file. 2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Ideally, we should get rid of stdarg.h as well. 3078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 31e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanovextern "C" const int __msan_keep_going; 32e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov 3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan; 3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define ENSURE_MSAN_INITED() do { \ 368028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov CHECK(!msan_init_is_running); \ 3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { \ 3878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_init(); \ 3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 4078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} while (0) 4178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define CHECK_UNPOISONED(x, n) \ 4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov do { \ 4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov sptr offset = __msan_test_shadow(x, n); \ 4570c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany if (__msan::IsInSymbolizer()) break; \ 4678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (offset >= 0 && flags()->report_umrs) { \ 4778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_CALLER_PC_BP_SP; \ 4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void)sp; \ 4978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("UMR in %s at offset %d inside [%p, +%d) \n", \ 5078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __FUNCTION__, offset, x, n); \ 5178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::PrintWarningWithOrigin( \ 5278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov pc, bp, __msan_get_origin((char*)x + offset)); \ 53e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov if (!__msan_keep_going) { \ 54e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov Printf("Exiting\n"); \ 55e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov Die(); \ 56e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov } \ 5778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 5878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } while (0) 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 606afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memset(void *ptr, int c, SIZE_T n); 616afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memcpy(void *dst, const void *src, SIZE_T n); 6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 636afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread, void *ptr, SIZE_T size, SIZE_T nmemb, void *file) { 6478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 656afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread)(ptr, size, nmemb, file); 6678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 6778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 6878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 6978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 7078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 716afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread_unlocked, void *ptr, SIZE_T size, SIZE_T nmemb, 7278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *file) { 7378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 746afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread_unlocked)(ptr, size, nmemb, file); 7578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 7778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 7878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 7978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 806afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, readlink, const char *path, char *buf, SIZE_T bufsiz) { 8178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 826afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(readlink)(path, buf, bufsiz); 8378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 8478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 8578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 8678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 8778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void *, readdir, void *a) { 8978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 9078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(readdir)(a); 919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(res, __sanitizer::struct_dirent_sz); 9278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 9378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 9478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 95d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy StepanovINTERCEPTOR(void *, readdir64, void *a) { 96d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov ENSURE_MSAN_INITED(); 97d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov void *res = REAL(readdir)(a); 98d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov __msan_unpoison(res, __sanitizer::struct_dirent64_sz); 99d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov return res; 100d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov} 101d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov 1026afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) { 10378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memcpy(dest, src, n); 10478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 10578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1066afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memmove, void *dest, const void *src, SIZE_T n) { 10778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memmove(dest, src, n); 10878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 10978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1106afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memset, void *s, int c, SIZE_T n) { 11178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memset(s, c, n); 11278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1146afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(int, posix_memalign, void **memptr, SIZE_T alignment, SIZE_T size) { 11578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 11678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(alignment & (alignment - 1), 0); 11778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov *memptr = MsanReallocate(&stack, 0, size, alignment, false); 11878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_NE(memptr, 0); 11978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return 0; 12078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 12178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 12278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void, free, void *ptr) { 12378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 12478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (ptr == 0) return; 12578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov MsanDeallocate(ptr); 12678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 12778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1286afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strlen, const char *s) { 12978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1306afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strlen)(s); 13178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, res + 1); 13278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 13378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 13478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1356afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strnlen, const char *s, SIZE_T n) { 13678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1376afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strnlen)(s, n); 1386afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T scan_size = (res == n) ? res : res + 1; 13978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, scan_size); 14078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 14178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 14278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 14378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: Add stricter shadow checks in str* interceptors (ex.: strcpy should 14478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// check the shadow of the terminating \0 byte). 14578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 14678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcpy, char *dest, const char *src) { // NOLINT 14778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1486afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 14978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcpy)(dest, src); // NOLINT 15078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n + 1); 15178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 15278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 15378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1546afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncpy, char *dest, const char *src, SIZE_T n) { // NOLINT 15578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1566afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strnlen)(src, n); 15778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 15878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 15978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncpy)(dest, src, n); // NOLINT 16078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, copy_size); 16178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 16278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 16378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 16478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strdup, char *src) { 16578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1666afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 16778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strdup)(src); 16878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(res, src, n + 1); 16978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 17078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 17178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1728aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovINTERCEPTOR(char *, __strdup, char *src) { 1738aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov ENSURE_MSAN_INITED(); 1748aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov SIZE_T n = REAL(strlen)(src); 1758aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *res = REAL(__strdup)(src); 1768aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_copy_poison(res, src, n + 1); 1778aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov return res; 1788aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 1798aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 1808aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovINTERCEPTOR(char *, strndup, char *src, SIZE_T n) { 1818aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov ENSURE_MSAN_INITED(); 1828aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov SIZE_T copy_size = REAL(strnlen)(src, n); 1838aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *res = REAL(strndup)(src, n); 1848aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_copy_poison(res, src, copy_size); 1858aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_unpoison(res + copy_size, 1); // \0 1868aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov return res; 1878aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 1888aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 1898aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovINTERCEPTOR(char *, __strndup, char *src, SIZE_T n) { 1908aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov ENSURE_MSAN_INITED(); 1918aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov SIZE_T copy_size = REAL(strnlen)(src, n); 1928aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *res = REAL(__strndup)(src, n); 1938aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_copy_poison(res, src, copy_size); 1948aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_unpoison(res + copy_size, 1); // \0 1958aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov return res; 1968aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 1978aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 1986afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, gcvt, double number, SIZE_T ndigit, char *buf) { 19978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 20078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(gcvt)(number, ndigit, buf); 20178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // DynamoRio tool will take care of unpoisoning gcvt result for us. 20278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 2036afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(buf); 20478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, n + 1); 20578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 20678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 20778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 20878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 20978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcat, char *dest, const char *src) { // NOLINT 21078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2116afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T src_size = REAL(strlen)(src); 2126afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 21378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcat)(dest, src); // NOLINT 21478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest + dest_size, src, src_size + 1); 21578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 21678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 21778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2186afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncat, char *dest, const char *src, SIZE_T n) { // NOLINT 21978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 2206afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 2216afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strlen)(src); 22278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 22378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 22478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncat)(dest, src, n); // NOLINT 22578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest + dest_size, src, copy_size); 22678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 22778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 22878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 22978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(long, strtol, const char *nptr, char **endptr, // NOLINT 23078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 23178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 23278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov long res = REAL(strtol)(nptr, endptr, base); // NOLINT 23378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 23478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 23578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 23678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 23778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 23878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 23978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(long long, strtoll, const char *nptr, char **endptr, // NOLINT 24078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 24178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 24278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov long res = REAL(strtoll)(nptr, endptr, base); //NOLINT 24378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 24478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 24578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 24678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 24778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 24878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 24978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(unsigned long, strtoul, const char *nptr, char **endptr, // NOLINT 25078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 25178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 25278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned long res = REAL(strtoul)(nptr, endptr, base); // NOLINT 25378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 25478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 25578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 25678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 25778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 25878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 25978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(unsigned long long, strtoull, const char *nptr, // NOLINT 26078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char **endptr, int base) { 26178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 26278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned long res = REAL(strtoull)(nptr, endptr, base); // NOLINT 26378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 26478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 26578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 26678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 26778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 26878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 269e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(double, strtod, const char *nptr, char **endptr) { // NOLINT 270e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 271e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov double res = REAL(strtod)(nptr, endptr); // NOLINT 272e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 273e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 274e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 275e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 276e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 277e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 278e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(float, strtof, const char *nptr, char **endptr) { // NOLINT 279e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 280e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov float res = REAL(strtof)(nptr, endptr); // NOLINT 281e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 282e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 283e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 284e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 285e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 286e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 287e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(long double, strtold, const char *nptr, char **endptr) { // NOLINT 288e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 289e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov long double res = REAL(strtold)(nptr, endptr); // NOLINT 290e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 291e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 292e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 293e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 294e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 295e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 29678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vsnprintf, char *str, uptr size, 29778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov const char *format, va_list ap) { 29878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 29978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vsnprintf)(str, size, format, ap); 30078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 30178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, res + 1); 30278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 30378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 30478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 30578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 30678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vsprintf, char *str, const char *format, va_list ap) { 30778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 30878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vsprintf)(str, format, ap); 30978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 31078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, res + 1); 31178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 31278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 31378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 31478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 31578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vswprintf, void *str, uptr size, void *format, va_list ap) { 31678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 31778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vswprintf)(str, size, format, ap); 31878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 31978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, 4 * (res + 1)); 32078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 32178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 32278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 32378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 32478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, sprintf, char *str, const char *format, ...) { // NOLINT 32578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 32678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 32778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 32878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vsprintf(str, format, ap); // NOLINT 32978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 33078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 33178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 33278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 33378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, snprintf, char *str, uptr size, const char *format, ...) { 33478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 33578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 33678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 33778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vsnprintf(str, size, format, ap); 33878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 33978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 34078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 34178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 34278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) { 34378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 34478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 34578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 34678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vswprintf(str, size, format, ap); 34778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 34878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 34978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 35078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3516afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// SIZE_T strftime(char *s, SIZE_T max, const char *format,const struct tm *tm); 3526afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strftime, char *s, SIZE_T max, const char *format, 35378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *tm) { 35478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3556afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strftime)(s, max, format, tm); 35678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) __msan_unpoison(s, res + 1); 35778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 35878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 35978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3606afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcstombs, void *dest, void *src, SIZE_T size) { 36178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3626afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcstombs)(dest, src, size); 3636afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany if (res != (SIZE_T)-1) __msan_unpoison(dest, res + 1); 36478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 36578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 36678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3676afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// SIZE_T mbstowcs(wchar_t *dest, const char *src, SIZE_T n); 3686afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, mbstowcs, wchar_t *dest, const char *src, SIZE_T n) { 36978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3706afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(mbstowcs)(dest, src, n); 3716afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany if (res != (SIZE_T)-1) __msan_unpoison(dest, (res + 1) * sizeof(wchar_t)); 37278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 37378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 37478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3756afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) { 37678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3776afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcslen)(s); 37878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, sizeof(wchar_t) * (res + 1)); 37978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 38078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 38178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 38278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcschr(const wchar_t *wcs, wchar_t wc); 38378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcschr, void *s, wchar_t wc, void *ps) { 38478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 38578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcschr)(s, wc, ps); 38678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 38778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 38878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 38978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcscpy(wchar_t *dest, const wchar_t *src); 39078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcscpy, wchar_t *dest, const wchar_t *src) { 39178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 39278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcscpy)(dest, src); 39378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); 39478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 39578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 39678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3976afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, SIZE_T n); 3986afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { 39978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 40078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemcpy)(dest, src, n); 40178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n * sizeof(wchar_t)); 40278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 40378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 40478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4056afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemset, wchar_t *s, wchar_t c, SIZE_T n) { 40678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(MEM_IS_APP(s)); 40778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 40878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = (wchar_t *)fast_memset(s, c, n * sizeof(wchar_t)); 40978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n * sizeof(wchar_t)); 41078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 41178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 41278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4136afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemmove, wchar_t *dest, const wchar_t *src, SIZE_T n) { 41478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 41578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemmove)(dest, src, n); 41678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_move_poison(dest, src, n * sizeof(wchar_t)); 41778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 41878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 41978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 42078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wcscmp, const wchar_t *s1, const wchar_t *s2) { 42178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 42278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wcscmp)(s1, s2); 42378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 42478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 42578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 42678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(double, wcstod, const wchar_t *nptr, wchar_t **endptr) { 42778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 42878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov double res = REAL(wcstod)(nptr, endptr); 42978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 43078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 43178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 43278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 43378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// #define UNSUPPORTED(name) \ 43478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// INTERCEPTOR(void, name, void) { \ 43578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Printf("MSAN: Unsupported %s\n", __FUNCTION__); \ 43678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Die(); \ 43778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// } 43878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 43978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: intercept the following functions: 44078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Note, they only matter when running without a dynamic tool. 44178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcscoll_l) 44278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsnrtombs) 44378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstol) 44478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoll) 44578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstold) 44678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoul) 44778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoull) 44878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsxfrm_l) 44978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsdup) 45078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsftime) 45178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsstr) 45278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsrchr) 45378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wctob) 45478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 45578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, gettimeofday, void *tv, void *tz) { 45678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 45778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(gettimeofday)(tv, tz); 45878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tv) 45978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tv, 16); 46078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tz) 46178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tz, 8); 46278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 46378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 46478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 46578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fcvt, double x, int a, int *b, int *c) { 46678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 46778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fcvt)(x, a, b, c); 46878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 46978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(b, sizeof(*b)); 47078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(c, sizeof(*c)); 47178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 47278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 47378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 47478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 47578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, getenv, char *name) { 47678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 47778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getenv)(name); 47878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 47978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 48078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, REAL(strlen)(res) + 1); 48178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 48278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 48378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 48478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 48578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) { 48678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 48778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat)(magic, fd, buf); 48878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4899358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 49078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 49178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 49278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 49378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) { 49478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 49578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat64)(magic, fd, buf); 49678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 49878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 49978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 50178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat, int magic, char *path, void *buf) { 50278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 50378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat)(magic, path, buf); 50478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 50678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 50778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 50978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat64, int magic, char *path, void *buf) { 51078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 51178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat64)(magic, path, buf); 51278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5139358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 51478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 51578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 51678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 51778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat, int magic, char *path, void *buf) { 51878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 51978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat)(magic, path, buf); 52078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5219358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 52278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 52378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 52478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 52578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat64, int magic, char *path, void *buf) { 52678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 52778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat64)(magic, path, buf); 52878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5299358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 53078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 53178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 53278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 53378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, pipe, int pipefd[2]) { 53478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 53578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(pipe)(pipefd); 53678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 53778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(pipe)(pipefd); 53878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 53978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(pipefd, sizeof(int[2])); 54078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 54178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 54278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 54378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wait, int *status) { 54478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 54578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wait)(status); 54678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (status) 54778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(status, sizeof(*status)); 54878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 54978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 55078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 55178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, waitpid, int pid, int *status, int options) { 5529e6d3b3a9fa14a4f64df83303d562451b88ae11bEvgeniy Stepanov if (msan_init_is_running) 5539e6d3b3a9fa14a4f64df83303d562451b88ae11bEvgeniy Stepanov return REAL(waitpid)(pid, status, options); 55478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 55578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(waitpid)(pid, status, options); 55678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (status) 55778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(status, sizeof(*status)); 55878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 55978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 56078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 56178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets, char *s, int size, void *stream) { 56278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 56378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets)(s, size, stream); 56478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 56578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 56678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 56778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 56878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 56978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets_unlocked, char *s, int size, void *stream) { 57078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 57178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets_unlocked)(s, size, stream); 57278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 57378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 57478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 57578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 57678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5776afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, getcwd, char *buf, SIZE_T size) { 57878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 57978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getcwd)(buf, size); 58078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 5817eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov __msan_unpoison(res, REAL(strlen)(res) + 1); 58278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 58378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 58478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 58578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, realpath, char *path, char *abspath) { 58678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 58778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(realpath)(path, abspath); 58878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 58978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(abspath, REAL(strlen)(abspath) + 1); 59078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 59178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 59278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 59378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit, int resource, void *rlim) { 59478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 59578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit)(resource, rlim); 59678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 59778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit)(resource, rlim); 59878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(rlim, __sanitizer::struct_rlimit_sz); 60078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 60178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 60278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 60378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit64, int resource, void *rlim) { 60478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 60578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit64)(resource, rlim); 60678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 60778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit64)(resource, rlim); 60878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(rlim, __sanitizer::struct_rlimit64_sz); 61078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 61178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 61278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 61378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, statfs, const char *s, void *buf) { 61478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 61578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(statfs)(s, buf); 61678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6179358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs_sz); 61878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 61978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 62078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 62178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, fstatfs, int fd, void *buf) { 62278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 62378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(fstatfs)(fd, buf); 62478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6259358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs_sz); 62678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 62778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 62878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 62978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, statfs64, const char *s, void *buf) { 63078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 63178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(statfs64)(s, buf); 63278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs64_sz); 63478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 63578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 63678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 63778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, fstatfs64, int fd, void *buf) { 63878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 63978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(fstatfs64)(fd, buf); 64078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6419358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs64_sz); 64278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 64378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 64478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 64578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, uname, void *utsname) { 64678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 64778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(uname)(utsname); 64878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) { 6499358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(utsname, __sanitizer::struct_utsname_sz); 65078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 65178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 65278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 65378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 65495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovINTERCEPTOR(int, gethostname, char *name, SIZE_T len) { 65595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov ENSURE_MSAN_INITED(); 65695d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov int res = REAL(gethostname)(name, len); 65795d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov if (!res) { 65895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov SIZE_T real_len = REAL(strnlen)(name, len); 65995d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov if (real_len < len) 66095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov ++real_len; 66195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov __msan_unpoison(name, real_len); 66295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov } 66395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov return res; 66495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov} 66595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov 66678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_wait, int epfd, void *events, int maxevents, 66778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout) { 66878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 66978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_wait)(epfd, events, maxevents, timeout); 67078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 6719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); 67278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 67378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 67478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 67578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 67678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_pwait, int epfd, void *events, int maxevents, 67778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout, void *sigmask) { 67878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 67978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_pwait)(epfd, events, maxevents, timeout, sigmask); 68078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 6819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); 68278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 68378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 68478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 68578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6866afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recv, int fd, void *buf, SIZE_T len, int flags) { 68778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6886afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recv)(fd, buf, len, flags); 68978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 69078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 69178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 69278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 69378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6946afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags, 69578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *srcaddr, void *addrlen) { 69678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6977b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov SIZE_T srcaddr_sz; 6987b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) 6999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov srcaddr_sz = __sanitizer_get_socklen_t(addrlen); 7006afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvfrom)(fd, buf, len, flags, srcaddr, addrlen); 7017b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (res > 0) { 70278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 7037b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) { 7049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov SIZE_T sz = __sanitizer_get_socklen_t(addrlen); 7057b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz); 7067b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 7077b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 70878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 70978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 71078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7116afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvmsg, int fd, struct msghdr *msg, int flags) { 71278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 7136afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvmsg)(fd, msg, flags); 71478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 7159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov for (SIZE_T i = 0; i < __sanitizer_get_msghdr_iovlen(msg); ++i) 7169358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(__sanitizer_get_msghdr_iov_iov_base(msg, i), 7179358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __sanitizer_get_msghdr_iov_iov_len(msg, i)); 71878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 71978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 72078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 72178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7226afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, calloc, SIZE_T nmemb, SIZE_T size) { 72365199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany if (CallocShouldReturnNullDueToOverflow(size, nmemb)) return 0; 72478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 72578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { 72678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym. 7276afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany const SIZE_T kCallocPoolSize = 1024; 72878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static uptr calloc_memory_for_dlsym[kCallocPoolSize]; 7296afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany static SIZE_T allocated; 7306afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize; 73178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *mem = (void*)&calloc_memory_for_dlsym[allocated]; 73278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov allocated += size_in_words; 73378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(allocated < kCallocPoolSize); 73478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return mem; 73578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 73678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, nmemb * size, sizeof(u64), true); 73778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 73878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7396afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, realloc, void *ptr, SIZE_T size) { 74078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 74178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, ptr, size, sizeof(u64), false); 74278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 74378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7446afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, malloc, SIZE_T size) { 74578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 74678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, size, sizeof(u64), false); 74778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 74878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 749887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanovvoid __msan_allocated_memory(void* data, uptr size) { 750887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 751887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov if (flags()->poison_in_malloc) 752887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov __msan_poison(data, size); 753887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov if (__msan_get_track_origins()) { 754887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov u32 stack_id = StackDepotPut(stack.trace, stack.size); 755887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov CHECK(stack_id); 756887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov CHECK_EQ((stack_id >> 31), 0); // Higher bit is occupied by stack origins. 757887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov __msan_set_origin(data, size, stack_id); 758887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov } 759887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov} 760887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov 7616afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap, void *addr, SIZE_T length, int prot, int flags, 7626afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF_T offset) { 76378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 76478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap)(addr, length, prot, flags, fd, offset); 76578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 76678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 76778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 76878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 76978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7706afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap64, void *addr, SIZE_T length, int prot, int flags, 7716afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF64_T offset) { 77278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 77378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap64)(addr, length, prot, flags, fd, offset); 77478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 77578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 77678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 77778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 77878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 779e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstruct dlinfo { 780e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_fname; 781e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_fbase; 782e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_sname; 783e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_saddr; 784e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}; 785e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 786e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, dladdr, void *addr, dlinfo *info) { 787e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 788e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(dladdr)(addr, info); 789e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res != 0) { 790e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info, sizeof(*info)); 791e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_fname) 792e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_fname, REAL(strlen)(info->dli_fname) + 1); 793e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_sname) 794e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_sname, REAL(strlen)(info->dli_sname) + 1); 795e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 796e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 797e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 798e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 7990f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// dlopen() ultimately calls mmap() down inside the loader, which generally 8000f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// doesn't participate in dynamic symbol resolution. Therefore we won't 8010f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// intercept its calls to mmap, and we have to hook it here. The loader 8020f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// initializes the module before returning, so without the dynamic component, we 8030f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// won't be able to clear the shadow before the initializers. Fixing this would 8040f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// require putting our own initializer first to clear the shadow. 8050f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerINTERCEPTOR(void *, dlopen, const char *filename, int flag) { 8060f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner ENSURE_MSAN_INITED(); 8070f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner EnterLoader(); 8080f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner link_map *map = (link_map *)REAL(dlopen)(filename, flag); 8090f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner ExitLoader(); 8106c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov if (!__msan_has_dynamic_component() && map) { 8110f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // If msandr didn't clear the shadow before the initializers ran, we do it 8120f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // ourselves afterwards. 8130f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner UnpoisonMappedDSO(map); 8140f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner } 8150f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner return (void *)map; 8160f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner} 8170f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner 818e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, getrusage, int who, void *usage) { 819e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 820e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(getrusage)(who, usage); 821e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res == 0) { 8229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(usage, __sanitizer::struct_rusage_sz); 823e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 824e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 825e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 826e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 82710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanovextern "C" int pthread_attr_init(void *attr); 82810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanovextern "C" int pthread_attr_destroy(void *attr); 82910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanovextern "C" int pthread_attr_setstacksize(void *attr, uptr stacksize); 830b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovextern "C" int pthread_attr_getstack(void *attr, uptr *stack, uptr *stacksize); 83110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 83210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovINTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), 83310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov void * param) { 83410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ENSURE_MSAN_INITED(); // for GetTlsSize() 83510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov __sanitizer_pthread_attr_t myattr; 83610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov if (attr == 0) { 83710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov pthread_attr_init(&myattr); 83810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov attr = &myattr; 83910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov } 840b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov 841b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov AdjustStackSizeLinux(attr, flags()->verbosity); 84210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 84310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov int res = REAL(pthread_create)(th, attr, callback, param); 84410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov if (attr == &myattr) 84510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov pthread_attr_destroy(&myattr); 84610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov return res; 84710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov} 84810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 849996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \ 850c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany __msan_unpoison(ptr, size) 851996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) do { } while (false) 852bee7415a86d9437659d09f034c346794bf15c2abEvgeniy Stepanov#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \ 85382a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov do { \ 85482a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov ctx = 0; \ 85582a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov (void)ctx; \ 85682a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov ENSURE_MSAN_INITED(); \ 85782a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov } while (false) 858996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd) do { } while (false) 859996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) do { } while (false) 86082a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov#define COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, name) \ 86182a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov do { } while (false) // FIXME 8624f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common/sanitizer_common_interceptors.inc" 863c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 86478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 8656afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memset(void *ptr, int c, SIZE_T n) { 86678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // hack until we have a really fast internal_memset 86778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 86878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 86978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)ptr % 8) == 0 && 87078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (c == 0 || c == -1)) { 87178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Printf("memset %p %zd %x\n", ptr, n, c); 87278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr to_store = c ? -1L : 0L; 87378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *p = (uptr*)ptr; 8746afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 87578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov p[i] = to_store; 87678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ptr; 87778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 87878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memset(ptr, c, n); 87978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 88078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 88178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 8826afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memcpy(void *dst, const void *src, SIZE_T n) { 88378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Same hack as in fast_memset above. 88478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 88578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 88678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)dst % 8) == 0 && 88778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)src % 8) == 0) { 88878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *d = (uptr*)dst; 88978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *s = (uptr*)src; 8906afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 89178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov d[i] = s[i]; 89278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return dst; 89378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 89478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memcpy(dst, src, n); 89578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 89678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 89778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// These interface functions reside here so that they can use 89878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// fast_memset, etc. 89978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_unpoison(void *a, uptr size) { 90078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 90178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 0, size); 90278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 90378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 90478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison(void *a, uptr size) { 90578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 90678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 90778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::flags()->poison_heap_with_zeroes ? 0 : -1, size); 90878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 90978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 91078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison_stack(void *a, uptr size) { 91178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 91278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 91378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::flags()->poison_stack_with_zeroes ? 0 : -1, size); 91478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 91578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 91678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_clear_and_unpoison(void *a, uptr size) { 91778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset(a, 0, size); 91878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 0, size); 91978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 92078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 92178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_copy_origin(void *dst, const void *src, uptr size) { 92278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_get_track_origins()) return; 92378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst) || !MEM_IS_APP(src)) return; 92478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr d = MEM_TO_ORIGIN(dst); 92578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr s = MEM_TO_ORIGIN(src); 92678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr beg = d & ~3UL; // align down. 92778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr end = (d + size + 3) & ~3UL; // align up. 92878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov s = s & ~3UL; // align down. 92978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memcpy((void*)beg, (void*)s, end - beg); 93078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 93178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 93278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_copy_poison(void *dst, const void *src, uptr size) { 93378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 93478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 93578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memcpy((void*)MEM_TO_SHADOW((uptr)dst), 93678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void*)MEM_TO_SHADOW((uptr)src), size); 93778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_origin(dst, src, size); 93878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 93978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 94078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_move_poison(void *dst, const void *src, uptr size) { 94178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 94278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 94378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov internal_memmove((void*)MEM_TO_SHADOW((uptr)dst), 94478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void*)MEM_TO_SHADOW((uptr)src), size); 94578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_origin(dst, src, size); 94678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 94778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 9486afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memcpy(void *dest, const void *src, SIZE_T n) { 94978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 95078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = fast_memcpy(dest, src, n); 95178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n); 95278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 95378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 95478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 9556afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memset(void *s, int c, SIZE_T n) { 95678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 95778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = fast_memset(s, c, n); 95878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n); 95978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 96078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 96178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 9626afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memmove(void *dest, const void *src, SIZE_T n) { 96378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 96478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(memmove)(dest, src, n); 96578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_move_poison(dest, src, n); 96678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 96778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 96878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 96978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan { 97078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid InitializeInterceptors() { 97178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static int inited = 0; 97278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(inited, 0); 973c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SANITIZER_COMMON_INTERCEPTORS_INIT; 974c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 9758028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap); 9768028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap64); 9778028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(posix_memalign); 9788028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(malloc); 9798028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(calloc); 9808028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realloc); 9818028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(free); 9828028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread); 9838028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread_unlocked); 9848028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readlink); 9858028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readdir); 986d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov INTERCEPT_FUNCTION(readdir64); 9878028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memcpy); 9888028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memset); 9898028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memmove); 9908028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemset); 9918028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemcpy); 9928028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemmove); 9938028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcpy); // NOLINT 9948028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strdup); 9958aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov INTERCEPT_FUNCTION(__strdup); 9968aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov INTERCEPT_FUNCTION(strndup); 9978aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov INTERCEPT_FUNCTION(__strndup); 9988028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncpy); // NOLINT 9998028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strlen); 10008028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strnlen); 10018028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gcvt); 10028028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcat); // NOLINT 10038028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncat); // NOLINT 10048028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtol); 10058028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoll); 10068028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoul); 10078028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoull); 1008e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtod); 1009e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtof); 1010e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtold); 10118028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vsprintf); 10128028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vsnprintf); 10138028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vswprintf); 10148028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(sprintf); // NOLINT 10158028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(snprintf); 10168028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(swprintf); 10178028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strftime); 10188028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstombs); 10198028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mbstowcs); 10208028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcslen); 10218028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcschr); 10228028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscpy); 10238028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscmp); 10248028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstod); 10258028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getenv); 10268028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gettimeofday); 10278028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fcvt); 10288028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat); 10298028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat); 10308028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat); 10318028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat64); 10328028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat64); 10338028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat64); 10348028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(pipe); 10358028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wait); 10368028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(waitpid); 10378028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets); 10388028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets_unlocked); 10398028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getcwd); 10408028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realpath); 10418028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit); 10428028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit64); 10438028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(statfs); 10448028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fstatfs); 10458028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(statfs64); 10468028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fstatfs64); 10478028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(uname); 104895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov INTERCEPT_FUNCTION(gethostname); 10498028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_wait); 10508028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_pwait); 10518028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recv); 10528028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvfrom); 10538028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvmsg); 1054e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(dladdr); 10550f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner INTERCEPT_FUNCTION(dlopen); 1056e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(getrusage); 105710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov INTERCEPT_FUNCTION(pthread_create); 105878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov inited = 1; 105978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 106078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} // namespace __msan 1061