msan_interceptors.cc revision 0f92deb81207c80481ff0257fbaba640fe669633
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" 2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <stdarg.h> 2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// ACHTUNG! No other system header includes in this file. 2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Ideally, we should get rid of stdarg.h as well. 2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 30e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanovextern "C" const int __msan_keep_going; 31e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov 3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan; 3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define ENSURE_MSAN_INITED() do { \ 358028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov CHECK(!msan_init_is_running); \ 3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { \ 3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_init(); \ 3878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} while (0) 4078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define CHECK_UNPOISONED(x, n) \ 4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov do { \ 4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov sptr offset = __msan_test_shadow(x, n); \ 4470c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany if (__msan::IsInSymbolizer()) break; \ 4578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (offset >= 0 && flags()->report_umrs) { \ 4678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_CALLER_PC_BP_SP; \ 4778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void)sp; \ 4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("UMR in %s at offset %d inside [%p, +%d) \n", \ 4978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __FUNCTION__, offset, x, n); \ 5078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::PrintWarningWithOrigin( \ 5178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov pc, bp, __msan_get_origin((char*)x + offset)); \ 52e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov if (!__msan_keep_going) { \ 53e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov Printf("Exiting\n"); \ 54e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov Die(); \ 55e36d0067390988b4f0334ff291f0652587fbe19bEvgeniy Stepanov } \ 5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 5778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } while (0) 5878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 596afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memset(void *ptr, int c, SIZE_T n); 606afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memcpy(void *dst, const void *src, SIZE_T n); 6178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 626afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread, void *ptr, SIZE_T size, SIZE_T nmemb, void *file) { 6378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 646afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread)(ptr, size, nmemb, file); 6578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 6678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 6778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 6878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 6978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 706afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread_unlocked, void *ptr, SIZE_T size, SIZE_T nmemb, 7178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *file) { 7278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 736afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread_unlocked)(ptr, size, nmemb, file); 7478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 7578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 7778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 7878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 796afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, readlink, const char *path, char *buf, SIZE_T bufsiz) { 8078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 816afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(readlink)(path, buf, bufsiz); 8278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 8378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 8478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 8578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 8678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void *, readdir, void *a) { 8878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 8978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(readdir)(a); 909358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(res, __sanitizer::struct_dirent_sz); 9178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 9278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 9378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 946afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) { 9578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memcpy(dest, src, n); 9678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 9778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 986afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memmove, void *dest, const void *src, SIZE_T n) { 9978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memmove(dest, src, n); 10078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 10178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1026afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memset, void *s, int c, SIZE_T n) { 10378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memset(s, c, n); 10478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 10578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1066afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(int, posix_memalign, void **memptr, SIZE_T alignment, SIZE_T size) { 10778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 10878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(alignment & (alignment - 1), 0); 10978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov *memptr = MsanReallocate(&stack, 0, size, alignment, false); 11078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_NE(memptr, 0); 11178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return 0; 11278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 11478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void, free, void *ptr) { 11578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 11678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (ptr == 0) return; 11778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov MsanDeallocate(ptr); 11878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1206afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strlen, const char *s) { 12178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1226afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strlen)(s); 12378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, res + 1); 12478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 12578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 12678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1276afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strnlen, const char *s, SIZE_T n) { 12878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1296afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strnlen)(s, n); 1306afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T scan_size = (res == n) ? res : res + 1; 13178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, scan_size); 13278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 13378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 13478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 13578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: Add stricter shadow checks in str* interceptors (ex.: strcpy should 13678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// check the shadow of the terminating \0 byte). 13778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 13878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcpy, char *dest, const char *src) { // NOLINT 13978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1406afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 14178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcpy)(dest, src); // NOLINT 14278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n + 1); 14378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 14478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 14578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1466afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncpy, char *dest, const char *src, SIZE_T n) { // NOLINT 14778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1486afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strnlen)(src, n); 14978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 15078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 15178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncpy)(dest, src, n); // NOLINT 15278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, copy_size); 15378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 15478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 15578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 15678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strdup, char *src) { 15778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1586afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 15978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strdup)(src); 16078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(res, src, n + 1); 16178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 16278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 16378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1646afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, gcvt, double number, SIZE_T ndigit, char *buf) { 16578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 16678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(gcvt)(number, ndigit, buf); 16778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // DynamoRio tool will take care of unpoisoning gcvt result for us. 16878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 1696afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(buf); 17078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, n + 1); 17178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 17278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 17378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 17478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 17578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcat, char *dest, const char *src) { // NOLINT 17678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1776afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T src_size = REAL(strlen)(src); 1786afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 17978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcat)(dest, src); // NOLINT 18078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest + dest_size, src, src_size + 1); 18178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 18278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 18378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1846afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncat, char *dest, const char *src, SIZE_T n) { // NOLINT 18578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1866afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 1876afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strlen)(src); 18878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 18978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 19078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncat)(dest, src, n); // NOLINT 19178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest + dest_size, src, copy_size); 19278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 19378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 19478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 19578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(long, strtol, const char *nptr, char **endptr, // NOLINT 19678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 19778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 19878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov long res = REAL(strtol)(nptr, endptr, base); // NOLINT 19978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 20078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 20178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 20278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 20378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 20478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 20578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(long long, strtoll, const char *nptr, char **endptr, // NOLINT 20678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 20778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 20878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov long res = REAL(strtoll)(nptr, endptr, base); //NOLINT 20978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 21078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 21178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 21278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 21378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 21478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 21578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(unsigned long, strtoul, const char *nptr, char **endptr, // NOLINT 21678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 21778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 21878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned long res = REAL(strtoul)(nptr, endptr, base); // NOLINT 21978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 22078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 22178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 22278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 22378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 22478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 22578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(unsigned long long, strtoull, const char *nptr, // NOLINT 22678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char **endptr, int base) { 22778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 22878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned long res = REAL(strtoull)(nptr, endptr, base); // NOLINT 22978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 23078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 23178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 23278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 23378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 23478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 235e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(double, strtod, const char *nptr, char **endptr) { // NOLINT 236e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 237e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov double res = REAL(strtod)(nptr, endptr); // NOLINT 238e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 239e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 240e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 241e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 242e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 243e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 244e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(float, strtof, const char *nptr, char **endptr) { // NOLINT 245e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 246e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov float res = REAL(strtof)(nptr, endptr); // NOLINT 247e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 248e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 249e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 250e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 251e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 252e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 253e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(long double, strtold, const char *nptr, char **endptr) { // NOLINT 254e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 255e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov long double res = REAL(strtold)(nptr, endptr); // NOLINT 256e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 257e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 258e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 259e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 260e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 261e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 26278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vsnprintf, char *str, uptr size, 26378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov const char *format, va_list ap) { 26478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 26578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vsnprintf)(str, size, format, ap); 26678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 26778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, res + 1); 26878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 26978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 27078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 27178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 27278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vsprintf, char *str, const char *format, va_list ap) { 27378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 27478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vsprintf)(str, format, ap); 27578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 27678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, res + 1); 27778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 27878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 27978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 28078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 28178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vswprintf, void *str, uptr size, void *format, va_list ap) { 28278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 28378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vswprintf)(str, size, format, ap); 28478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 28578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, 4 * (res + 1)); 28678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 28778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 28878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 28978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 29078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, sprintf, char *str, const char *format, ...) { // NOLINT 29178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 29278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 29378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 29478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vsprintf(str, format, ap); // NOLINT 29578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 29678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 29778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 29878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 29978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, snprintf, char *str, uptr size, const char *format, ...) { 30078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 30178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 30278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 30378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vsnprintf(str, size, format, ap); 30478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 30578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 30678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 30778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 30878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) { 30978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 31078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 31178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 31278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vswprintf(str, size, format, ap); 31378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 31478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 31578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 31678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3176afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// SIZE_T strftime(char *s, SIZE_T max, const char *format,const struct tm *tm); 3186afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strftime, char *s, SIZE_T max, const char *format, 31978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *tm) { 32078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3216afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strftime)(s, max, format, tm); 32278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) __msan_unpoison(s, res + 1); 32378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 32478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 32578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3266afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcstombs, void *dest, void *src, SIZE_T size) { 32778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3286afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcstombs)(dest, src, size); 3296afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany if (res != (SIZE_T)-1) __msan_unpoison(dest, res + 1); 33078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 33178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 33278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3336afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// SIZE_T mbstowcs(wchar_t *dest, const char *src, SIZE_T n); 3346afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, mbstowcs, wchar_t *dest, const char *src, SIZE_T n) { 33578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3366afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(mbstowcs)(dest, src, n); 3376afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany if (res != (SIZE_T)-1) __msan_unpoison(dest, (res + 1) * sizeof(wchar_t)); 33878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 33978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 34078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3416afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) { 34278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3436afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcslen)(s); 34478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, sizeof(wchar_t) * (res + 1)); 34578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 34678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 34778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 34878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcschr(const wchar_t *wcs, wchar_t wc); 34978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcschr, void *s, wchar_t wc, void *ps) { 35078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 35178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcschr)(s, wc, ps); 35278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 35378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 35478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 35578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcscpy(wchar_t *dest, const wchar_t *src); 35678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcscpy, wchar_t *dest, const wchar_t *src) { 35778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 35878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcscpy)(dest, src); 35978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); 36078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 36178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 36278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3636afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, SIZE_T n); 3646afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { 36578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 36678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemcpy)(dest, src, n); 36778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n * sizeof(wchar_t)); 36878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 36978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 37078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3716afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemset, wchar_t *s, wchar_t c, SIZE_T n) { 37278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(MEM_IS_APP(s)); 37378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 37478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = (wchar_t *)fast_memset(s, c, n * sizeof(wchar_t)); 37578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n * sizeof(wchar_t)); 37678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 37778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 37878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3796afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemmove, wchar_t *dest, const wchar_t *src, SIZE_T n) { 38078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 38178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemmove)(dest, src, n); 38278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_move_poison(dest, src, n * sizeof(wchar_t)); 38378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 38478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 38578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 38678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wcscmp, const wchar_t *s1, const wchar_t *s2) { 38778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 38878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wcscmp)(s1, s2); 38978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 39078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 39178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 39278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(double, wcstod, const wchar_t *nptr, wchar_t **endptr) { 39378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 39478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov double res = REAL(wcstod)(nptr, endptr); 39578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 39678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 39778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 39878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 39978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// #define UNSUPPORTED(name) \ 40078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// INTERCEPTOR(void, name, void) { \ 40178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Printf("MSAN: Unsupported %s\n", __FUNCTION__); \ 40278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Die(); \ 40378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// } 40478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 40578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: intercept the following functions: 40678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Note, they only matter when running without a dynamic tool. 40778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcscoll_l) 40878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsnrtombs) 40978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstol) 41078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoll) 41178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstold) 41278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoul) 41378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoull) 41478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsxfrm_l) 41578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsdup) 41678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsftime) 41778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsstr) 41878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsrchr) 41978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wctob) 42078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 42178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, gettimeofday, void *tv, void *tz) { 42278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 42378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(gettimeofday)(tv, tz); 42478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tv) 42578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tv, 16); 42678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tz) 42778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tz, 8); 42878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 42978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 43078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 43178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fcvt, double x, int a, int *b, int *c) { 43278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 43378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fcvt)(x, a, b, c); 43478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 43578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(b, sizeof(*b)); 43678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(c, sizeof(*c)); 43778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 43878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 43978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 44078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 44178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, getenv, char *name) { 44278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 44378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getenv)(name); 44478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 44578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 44678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, REAL(strlen)(res) + 1); 44778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 44878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 44978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 45078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 45178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) { 45278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 45378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat)(magic, fd, buf); 45478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4559358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 45678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 45778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 45878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 45978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) { 46078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 46178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat64)(magic, fd, buf); 46278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4639358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 46478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 46578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 46678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 46778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat, int magic, char *path, void *buf) { 46878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 46978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat)(magic, path, buf); 47078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 47278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 47378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 47478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 47578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat64, int magic, char *path, void *buf) { 47678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 47778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat64)(magic, path, buf); 47878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 48078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 48178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 48278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 48378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat, int magic, char *path, void *buf) { 48478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 48578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat)(magic, path, buf); 48678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat_sz); 48878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 48978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 49078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 49178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat64, int magic, char *path, void *buf) { 49278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 49378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat64)(magic, path, buf); 49478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 4959358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_stat64_sz); 49678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 49778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 49878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 49978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, pipe, int pipefd[2]) { 50078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 50178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(pipe)(pipefd); 50278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 50378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(pipe)(pipefd); 50478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 50578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(pipefd, sizeof(int[2])); 50678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 50778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 50978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wait, int *status) { 51078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 51178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wait)(status); 51278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (status) 51378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(status, sizeof(*status)); 51478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 51578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 51678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 51778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, waitpid, int pid, int *status, int options) { 5189e6d3b3a9fa14a4f64df83303d562451b88ae11bEvgeniy Stepanov if (msan_init_is_running) 5199e6d3b3a9fa14a4f64df83303d562451b88ae11bEvgeniy Stepanov return REAL(waitpid)(pid, status, options); 52078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 52178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(waitpid)(pid, status, options); 52278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (status) 52378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(status, sizeof(*status)); 52478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 52578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 52678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 52778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets, char *s, int size, void *stream) { 52878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 52978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets)(s, size, stream); 53078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 53178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 53278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 53378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 53478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 53578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets_unlocked, char *s, int size, void *stream) { 53678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 53778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets_unlocked)(s, size, stream); 53878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 53978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 54078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 54178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 54278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5436afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, getcwd, char *buf, SIZE_T size) { 54478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 54578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getcwd)(buf, size); 54678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 5477eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov __msan_unpoison(res, REAL(strlen)(res) + 1); 54878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 54978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 55078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 55178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, realpath, char *path, char *abspath) { 55278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 55378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(realpath)(path, abspath); 55478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 55578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(abspath, REAL(strlen)(abspath) + 1); 55678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 55778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 55878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 55978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit, int resource, void *rlim) { 56078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 56178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit)(resource, rlim); 56278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 56378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit)(resource, rlim); 56478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(rlim, __sanitizer::struct_rlimit_sz); 56678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 56778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 56878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 56978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit64, int resource, void *rlim) { 57078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 57178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit64)(resource, rlim); 57278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 57378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit64)(resource, rlim); 57478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(rlim, __sanitizer::struct_rlimit64_sz); 57678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 57778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 57878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 57978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, statfs, const char *s, void *buf) { 58078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 58178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(statfs)(s, buf); 58278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5839358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs_sz); 58478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 58578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 58678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 58778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, fstatfs, int fd, void *buf) { 58878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 58978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(fstatfs)(fd, buf); 59078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs_sz); 59278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 59378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 59478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 59578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, statfs64, const char *s, void *buf) { 59678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 59778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(statfs64)(s, buf); 59878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 5999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs64_sz); 60078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 60178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 60278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 60378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, fstatfs64, int fd, void *buf) { 60478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 60578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(fstatfs64)(fd, buf); 60678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 6079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(buf, __sanitizer::struct_statfs64_sz); 60878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 60978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 61078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 61178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, uname, void *utsname) { 61278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 61378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(uname)(utsname); 61478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) { 6159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(utsname, __sanitizer::struct_utsname_sz); 61678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 61778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 61878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 61978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 62095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovINTERCEPTOR(int, gethostname, char *name, SIZE_T len) { 62195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov ENSURE_MSAN_INITED(); 62295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov int res = REAL(gethostname)(name, len); 62395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov if (!res) { 62495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov SIZE_T real_len = REAL(strnlen)(name, len); 62595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov if (real_len < len) 62695d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov ++real_len; 62795d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov __msan_unpoison(name, real_len); 62895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov } 62995d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov return res; 63095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov} 63195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov 63278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_wait, int epfd, void *events, int maxevents, 63378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout) { 63478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 63578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_wait)(epfd, events, maxevents, timeout); 63678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 6379358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); 63878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 63978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 64078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 64178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 64278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_pwait, int epfd, void *events, int maxevents, 64378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout, void *sigmask) { 64478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 64578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_pwait)(epfd, events, maxevents, timeout, sigmask); 64678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 6479358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); 64878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 64978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 65078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 65178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6526afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recv, int fd, void *buf, SIZE_T len, int flags) { 65378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6546afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recv)(fd, buf, len, flags); 65578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 65678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 65778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 65878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 65978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6606afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags, 66178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *srcaddr, void *addrlen) { 66278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6637b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov SIZE_T srcaddr_sz; 6647b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) 6659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov srcaddr_sz = __sanitizer_get_socklen_t(addrlen); 6666afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvfrom)(fd, buf, len, flags, srcaddr, addrlen); 6677b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (res > 0) { 66878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 6697b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) { 6709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov SIZE_T sz = __sanitizer_get_socklen_t(addrlen); 6717b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz); 6727b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 6737b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 67478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 67578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 67678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6776afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvmsg, int fd, struct msghdr *msg, int flags) { 67878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6796afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvmsg)(fd, msg, flags); 68078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 6819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov for (SIZE_T i = 0; i < __sanitizer_get_msghdr_iovlen(msg); ++i) 6829358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(__sanitizer_get_msghdr_iov_iov_base(msg, i), 6839358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __sanitizer_get_msghdr_iov_iov_len(msg, i)); 68478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 68578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 68678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 68778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6886afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, calloc, SIZE_T nmemb, SIZE_T size) { 68965199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany if (CallocShouldReturnNullDueToOverflow(size, nmemb)) return 0; 69078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 69178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { 69278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym. 6936afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany const SIZE_T kCallocPoolSize = 1024; 69478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static uptr calloc_memory_for_dlsym[kCallocPoolSize]; 6956afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany static SIZE_T allocated; 6966afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize; 69778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *mem = (void*)&calloc_memory_for_dlsym[allocated]; 69878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov allocated += size_in_words; 69978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(allocated < kCallocPoolSize); 70078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return mem; 70178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 70278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, nmemb * size, sizeof(u64), true); 70378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 70478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7056afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, realloc, void *ptr, SIZE_T size) { 70678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 70778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, ptr, size, sizeof(u64), false); 70878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 70978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7106afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, malloc, SIZE_T size) { 71178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 71278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, size, sizeof(u64), false); 71378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 71478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 715887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanovvoid __msan_allocated_memory(void* data, uptr size) { 716887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov GET_MALLOC_STACK_TRACE; 717887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov if (flags()->poison_in_malloc) 718887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov __msan_poison(data, size); 719887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov if (__msan_get_track_origins()) { 720887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov u32 stack_id = StackDepotPut(stack.trace, stack.size); 721887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov CHECK(stack_id); 722887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov CHECK_EQ((stack_id >> 31), 0); // Higher bit is occupied by stack origins. 723887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov __msan_set_origin(data, size, stack_id); 724887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov } 725887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov} 726887a5feeb59a515e2fc291ceb8451dc569936124Evgeniy Stepanov 7276afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap, void *addr, SIZE_T length, int prot, int flags, 7286afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF_T offset) { 72978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 73078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap)(addr, length, prot, flags, fd, offset); 73178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 73278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 73378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 73478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 73578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7366afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap64, void *addr, SIZE_T length, int prot, int flags, 7376afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF64_T offset) { 73878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 73978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap64)(addr, length, prot, flags, fd, offset); 74078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 74178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 74278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 74378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 74478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 745e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstruct dlinfo { 746e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_fname; 747e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_fbase; 748e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_sname; 749e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_saddr; 750e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}; 751e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 752e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, dladdr, void *addr, dlinfo *info) { 753e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 754e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(dladdr)(addr, info); 755e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res != 0) { 756e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info, sizeof(*info)); 757e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_fname) 758e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_fname, REAL(strlen)(info->dli_fname) + 1); 759e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_sname) 760e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_sname, REAL(strlen)(info->dli_sname) + 1); 761e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 762e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 763e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 764e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 7650f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// dlopen() ultimately calls mmap() down inside the loader, which generally 7660f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// doesn't participate in dynamic symbol resolution. Therefore we won't 7670f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// intercept its calls to mmap, and we have to hook it here. The loader 7680f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// initializes the module before returning, so without the dynamic component, we 7690f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// won't be able to clear the shadow before the initializers. Fixing this would 7700f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner// require putting our own initializer first to clear the shadow. 7710f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerINTERCEPTOR(void *, dlopen, const char *filename, int flag) { 7720f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner ENSURE_MSAN_INITED(); 7730f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner EnterLoader(); 7740f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner link_map *map = (link_map *)REAL(dlopen)(filename, flag); 7750f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner ExitLoader(); 7760f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner if (!__msan_has_dynamic_component()) { 7770f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // If msandr didn't clear the shadow before the initializers ran, we do it 7780f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // ourselves afterwards. 7790f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner UnpoisonMappedDSO(map); 7800f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner } 7810f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner return (void *)map; 7820f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner} 7830f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner 784e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, getrusage, int who, void *usage) { 785e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 786e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(getrusage)(who, usage); 787e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res == 0) { 7889358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov __msan_unpoison(usage, __sanitizer::struct_rusage_sz); 789e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 790e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 791e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 792e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 793996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \ 794c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany __msan_unpoison(ptr, size) 795996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) do { } while (false) 796bee7415a86d9437659d09f034c346794bf15c2abEvgeniy Stepanov#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \ 79782a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov do { \ 79882a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov ctx = 0; \ 79982a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov (void)ctx; \ 80082a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov ENSURE_MSAN_INITED(); \ 80182a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov } while (false) 802996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd) do { } while (false) 803996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) do { } while (false) 80482a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov#define COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, name) \ 80582a9080eaff95d69b270cd863e9df63e3b4e59adEvgeniy Stepanov do { } while (false) // FIXME 8064f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common/sanitizer_common_interceptors.inc" 807c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 80878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 8096afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memset(void *ptr, int c, SIZE_T n) { 81078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // hack until we have a really fast internal_memset 81178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 81278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 81378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)ptr % 8) == 0 && 81478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (c == 0 || c == -1)) { 81578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Printf("memset %p %zd %x\n", ptr, n, c); 81678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr to_store = c ? -1L : 0L; 81778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *p = (uptr*)ptr; 8186afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 81978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov p[i] = to_store; 82078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ptr; 82178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 82278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memset(ptr, c, n); 82378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 82478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 82578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 8266afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memcpy(void *dst, const void *src, SIZE_T n) { 82778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Same hack as in fast_memset above. 82878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 82978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 83078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)dst % 8) == 0 && 83178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)src % 8) == 0) { 83278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *d = (uptr*)dst; 83378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *s = (uptr*)src; 8346afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 83578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov d[i] = s[i]; 83678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return dst; 83778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 83878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memcpy(dst, src, n); 83978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 84078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 84178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// These interface functions reside here so that they can use 84278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// fast_memset, etc. 84378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_unpoison(void *a, uptr size) { 84478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 84578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 0, size); 84678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 84778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 84878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison(void *a, uptr size) { 84978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 85078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 85178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::flags()->poison_heap_with_zeroes ? 0 : -1, size); 85278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 85378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 85478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison_stack(void *a, uptr size) { 85578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 85678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 85778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::flags()->poison_stack_with_zeroes ? 0 : -1, size); 85878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 85978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 86078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_clear_and_unpoison(void *a, uptr size) { 86178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset(a, 0, size); 86278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 0, size); 86378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 86478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 86578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_copy_origin(void *dst, const void *src, uptr size) { 86678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_get_track_origins()) return; 86778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst) || !MEM_IS_APP(src)) return; 86878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr d = MEM_TO_ORIGIN(dst); 86978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr s = MEM_TO_ORIGIN(src); 87078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr beg = d & ~3UL; // align down. 87178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr end = (d + size + 3) & ~3UL; // align up. 87278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov s = s & ~3UL; // align down. 87378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memcpy((void*)beg, (void*)s, end - beg); 87478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 87578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 87678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_copy_poison(void *dst, const void *src, uptr size) { 87778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 87878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 87978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memcpy((void*)MEM_TO_SHADOW((uptr)dst), 88078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void*)MEM_TO_SHADOW((uptr)src), size); 88178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_origin(dst, src, size); 88278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 88378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 88478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_move_poison(void *dst, const void *src, uptr size) { 88578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 88678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 88778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov internal_memmove((void*)MEM_TO_SHADOW((uptr)dst), 88878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void*)MEM_TO_SHADOW((uptr)src), size); 88978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_origin(dst, src, size); 89078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 89178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8926afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memcpy(void *dest, const void *src, SIZE_T n) { 89378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 89478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = fast_memcpy(dest, src, n); 89578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n); 89678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 89778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 89878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8996afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memset(void *s, int c, SIZE_T n) { 90078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 90178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = fast_memset(s, c, n); 90278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n); 90378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 90478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 90578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 9066afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memmove(void *dest, const void *src, SIZE_T n) { 90778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 90878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(memmove)(dest, src, n); 90978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_move_poison(dest, src, n); 91078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 91178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 91278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 91378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan { 91478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid InitializeInterceptors() { 91578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static int inited = 0; 91678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(inited, 0); 917c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SANITIZER_COMMON_INTERCEPTORS_INIT; 918c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 9198028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap); 9208028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap64); 9218028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(posix_memalign); 9228028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(malloc); 9238028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(calloc); 9248028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realloc); 9258028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(free); 9268028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread); 9278028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread_unlocked); 9288028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readlink); 9298028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readdir); 9308028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memcpy); 9318028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memset); 9328028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memmove); 9338028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemset); 9348028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemcpy); 9358028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemmove); 9368028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcpy); // NOLINT 9378028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strdup); 9388028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncpy); // NOLINT 9398028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strlen); 9408028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strnlen); 9418028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gcvt); 9428028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcat); // NOLINT 9438028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncat); // NOLINT 9448028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtol); 9458028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoll); 9468028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoul); 9478028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoull); 948e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtod); 949e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtof); 950e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtold); 9518028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vsprintf); 9528028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vsnprintf); 9538028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vswprintf); 9548028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(sprintf); // NOLINT 9558028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(snprintf); 9568028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(swprintf); 9578028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strftime); 9588028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstombs); 9598028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mbstowcs); 9608028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcslen); 9618028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcschr); 9628028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscpy); 9638028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscmp); 9648028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstod); 9658028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getenv); 9668028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gettimeofday); 9678028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fcvt); 9688028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat); 9698028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat); 9708028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat); 9718028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat64); 9728028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat64); 9738028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat64); 9748028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(pipe); 9758028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wait); 9768028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(waitpid); 9778028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets); 9788028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets_unlocked); 9798028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getcwd); 9808028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realpath); 9818028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit); 9828028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit64); 9838028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(statfs); 9848028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fstatfs); 9858028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(statfs64); 9868028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fstatfs64); 9878028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(uname); 98895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov INTERCEPT_FUNCTION(gethostname); 9898028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_wait); 9908028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_pwait); 9918028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recv); 9928028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvfrom); 9938028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvmsg); 994e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(dladdr); 9950f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner INTERCEPT_FUNCTION(dlopen); 996e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(getrusage); 99778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov inited = 1; 99878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 99978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} // namespace __msan 1000