msan_interceptors.cc revision bee7415a86d9437659d09f034c346794bf15c2ab
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" 2078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan_platform_limits_posix.h" 2178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_common.h" 2278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_libc.h" 2378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <stdarg.h> 2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// ACHTUNG! No other system header includes in this file. 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Ideally, we should get rid of stdarg.h as well. 2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan; 2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define ENSURE_MSAN_INITED() do { \ 318028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov CHECK(!msan_init_is_running); \ 3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { \ 3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_init(); \ 3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} while (0) 3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define CHECK_UNPOISONED(x, n) \ 3878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov do { \ 3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov sptr offset = __msan_test_shadow(x, n); \ 4078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (offset >= 0 && flags()->report_umrs) { \ 4178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_CALLER_PC_BP_SP; \ 4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void)sp; \ 4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("UMR in %s at offset %d inside [%p, +%d) \n", \ 4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __FUNCTION__, offset, x, n); \ 4578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::PrintWarningWithOrigin( \ 4678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov pc, bp, __msan_get_origin((char*)x + offset)); \ 4778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } \ 4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } while (0) 4978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 506afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memset(void *ptr, int c, SIZE_T n); 516afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanystatic void *fast_memcpy(void *dst, const void *src, SIZE_T n); 5278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 536afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread, void *ptr, SIZE_T size, SIZE_T nmemb, void *file) { 5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 556afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread)(ptr, size, nmemb, file); 5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 5778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(ptr, res *size); 5878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 6078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 616afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, fread_unlocked, void *ptr, SIZE_T size, SIZE_T nmemb, 6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *file) { 6378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 646afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(fread_unlocked)(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(SSIZE_T, readlink, const char *path, char *buf, SIZE_T bufsiz) { 7178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 726afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(readlink)(path, buf, bufsiz); 7378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 7478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 7578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 7778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void *, readdir, void *a) { 7978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 8078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(readdir)(a); 8178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, __msan::struct_dirent_sz); 8278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 8378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 8478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 856afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) { 8678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memcpy(dest, src, n); 8778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 8878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 896afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memmove, void *dest, const void *src, SIZE_T n) { 9078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memmove(dest, src, n); 9178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 9278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 936afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, memset, void *s, int c, SIZE_T n) { 9478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_memset(s, c, n); 9578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 9678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 976afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(int, posix_memalign, void **memptr, SIZE_T alignment, SIZE_T size) { 9878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 9978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(alignment & (alignment - 1), 0); 10078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov *memptr = MsanReallocate(&stack, 0, size, alignment, false); 10178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_NE(memptr, 0); 10278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return 0; 10378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 10478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 10578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(void, free, void *ptr) { 10678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 10778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (ptr == 0) return; 10878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov MsanDeallocate(ptr); 10978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1116afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strlen, const char *s) { 11278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1136afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strlen)(s); 11478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, res + 1); 11578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 11678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1186afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strnlen, const char *s, SIZE_T n) { 11978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1206afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strnlen)(s, n); 1216afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T scan_size = (res == n) ? res : res + 1; 12278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, scan_size); 12378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 12478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 12578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 12678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: Add stricter shadow checks in str* interceptors (ex.: strcpy should 12778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// check the shadow of the terminating \0 byte). 12878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 12978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcpy, char *dest, const char *src) { // NOLINT 13078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1316afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 13278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcpy)(dest, src); // NOLINT 13378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n + 1); 13478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 13578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 13678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1376afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncpy, char *dest, const char *src, SIZE_T n) { // NOLINT 13878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1396afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strnlen)(src, n); 14078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 14178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 14278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncpy)(dest, src, n); // NOLINT 14378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, copy_size); 14478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 14578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 14678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 14778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strdup, char *src) { 14878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1496afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(src); 15078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strdup)(src); 15178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(res, src, n + 1); 15278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 15378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 15478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1556afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, gcvt, double number, SIZE_T ndigit, char *buf) { 15678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 15778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(gcvt)(number, ndigit, buf); 15878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // DynamoRio tool will take care of unpoisoning gcvt result for us. 15978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 1606afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T n = REAL(strlen)(buf); 16178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, n + 1); 16278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 16378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 16478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 16578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 16678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, strcat, char *dest, const char *src) { // NOLINT 16778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1686afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T src_size = REAL(strlen)(src); 1696afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 17078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strcat)(dest, src); // NOLINT 17178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest + dest_size, src, src_size + 1); 17278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 17378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 17478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1756afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, strncat, char *dest, const char *src, SIZE_T n) { // NOLINT 17678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 1776afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T dest_size = REAL(strlen)(dest); 1786afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T copy_size = REAL(strlen)(src); 17978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (copy_size < n) 18078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov copy_size++; // trailing \0 18178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(strncat)(dest, src, n); // NOLINT 18278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest + dest_size, src, copy_size); 18378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 18478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 18578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 18678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(long, strtol, const char *nptr, char **endptr, // NOLINT 18778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 18878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 18978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov long res = REAL(strtol)(nptr, endptr, base); // NOLINT 19078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 19178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 19278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 19378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 19478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 19578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 19678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(long long, strtoll, const char *nptr, char **endptr, // NOLINT 19778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 19878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 19978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov long res = REAL(strtoll)(nptr, endptr, base); //NOLINT 20078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 20178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 20278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 20378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 20478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 20578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 20678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(unsigned long, strtoul, const char *nptr, char **endptr, // NOLINT 20778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int base) { 20878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 20978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned long res = REAL(strtoul)(nptr, endptr, base); // NOLINT 21078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 21178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 21278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 21378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 21478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 21578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 21678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(unsigned long long, strtoull, const char *nptr, // NOLINT 21778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char **endptr, int base) { 21878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 21978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned long res = REAL(strtoull)(nptr, endptr, base); // NOLINT 22078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 22178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 22278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 22378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 22478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 22578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 226e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(double, strtod, const char *nptr, char **endptr) { // NOLINT 227e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 228e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov double res = REAL(strtod)(nptr, endptr); // NOLINT 229e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 230e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 231e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 232e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 233e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 234e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 235e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(float, strtof, const char *nptr, char **endptr) { // NOLINT 236e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 237e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov float res = REAL(strtof)(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(long double, strtold, const char *nptr, char **endptr) { // NOLINT 245e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 246e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov long double res = REAL(strtold)(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 25378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vsnprintf, char *str, uptr size, 25478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov const char *format, va_list ap) { 25578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 25678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vsnprintf)(str, size, format, ap); 25778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 25878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, res + 1); 25978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 26078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 26178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 26278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 26378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, vsprintf, char *str, const char *format, va_list ap) { 26478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 26578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vsprintf)(str, 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, vswprintf, void *str, uptr size, void *format, va_list ap) { 27378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 27478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(vswprintf)(str, size, format, ap); 27578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 27678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(str, 4 * (res + 1)); 27778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 27878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 27978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 28078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 28178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, sprintf, char *str, const char *format, ...) { // NOLINT 28278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 28378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 28478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 28578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vsprintf(str, format, ap); // NOLINT 28678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 28778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 28878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 28978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 29078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, snprintf, char *str, uptr size, const char *format, ...) { 29178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 29278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 29378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 29478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vsnprintf(str, size, format, ap); 29578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 29678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 29778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 29878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 29978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) { 30078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 30178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_list ap; 30278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_start(ap, format); 30378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = vswprintf(str, size, format, ap); 30478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov va_end(ap); 30578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 30678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 30778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3086afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// SIZE_T strftime(char *s, SIZE_T max, const char *format,const struct tm *tm); 3096afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, strftime, char *s, SIZE_T max, const char *format, 31078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *tm) { 31178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3126afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(strftime)(s, max, format, tm); 31378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) __msan_unpoison(s, res + 1); 31478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 31578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 31678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3176afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcstombs, void *dest, void *src, SIZE_T size) { 31878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3196afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcstombs)(dest, src, size); 3206afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany if (res != (SIZE_T)-1) __msan_unpoison(dest, res + 1); 32178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 32278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 32378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3246afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// SIZE_T mbstowcs(wchar_t *dest, const char *src, SIZE_T n); 3256afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, mbstowcs, wchar_t *dest, const char *src, SIZE_T n) { 32678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3276afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(mbstowcs)(dest, src, n); 3286afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany if (res != (SIZE_T)-1) __msan_unpoison(dest, (res + 1) * sizeof(wchar_t)); 32978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 33078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 33178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3326afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) { 33378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 3346afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T res = REAL(wcslen)(s); 33578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_UNPOISONED(s, sizeof(wchar_t) * (res + 1)); 33678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 33778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 33878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 33978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcschr(const wchar_t *wcs, wchar_t wc); 34078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcschr, void *s, wchar_t wc, void *ps) { 34178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 34278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcschr)(s, wc, ps); 34378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 34478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 34578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 34678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// wchar_t *wcscpy(wchar_t *dest, const wchar_t *src); 34778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(wchar_t *, wcscpy, wchar_t *dest, const wchar_t *src) { 34878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 34978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wcscpy)(dest, src); 35078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); 35178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 35278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 35378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3546afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany// wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, SIZE_T n); 3556afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { 35678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 35778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemcpy)(dest, src, n); 35878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n * sizeof(wchar_t)); 35978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 36078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 36178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3626afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemset, wchar_t *s, wchar_t c, SIZE_T n) { 36378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(MEM_IS_APP(s)); 36478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 36578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = (wchar_t *)fast_memset(s, c, n * sizeof(wchar_t)); 36678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n * sizeof(wchar_t)); 36778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 36878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 36978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3706afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(wchar_t *, wmemmove, wchar_t *dest, const wchar_t *src, SIZE_T n) { 37178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 37278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov wchar_t *res = REAL(wmemmove)(dest, src, n); 37378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_move_poison(dest, src, n * sizeof(wchar_t)); 37478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 37578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 37678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 37778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wcscmp, const wchar_t *s1, const wchar_t *s2) { 37878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 37978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wcscmp)(s1, s2); 38078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 38178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 38278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 38378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(double, wcstod, const wchar_t *nptr, wchar_t **endptr) { 38478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 38578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov double res = REAL(wcstod)(nptr, endptr); 38678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(endptr, sizeof(*endptr)); 38778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 38878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 38978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 39078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// #define UNSUPPORTED(name) \ 39178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// INTERCEPTOR(void, name, void) { \ 39278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Printf("MSAN: Unsupported %s\n", __FUNCTION__); \ 39378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Die(); \ 39478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// } 39578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 39678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: intercept the following functions: 39778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Note, they only matter when running without a dynamic tool. 39878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcscoll_l) 39978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsnrtombs) 40078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstol) 40178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoll) 40278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstold) 40378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoul) 40478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcstoull) 40578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsxfrm_l) 40678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsdup) 40778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsftime) 40878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsstr) 40978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wcsrchr) 41078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// UNSUPPORTED(wctob) 41178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 41278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, gettimeofday, void *tv, void *tz) { 41378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 41478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(gettimeofday)(tv, tz); 41578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tv) 41678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tv, 16); 41778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (tz) 41878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(tz, 8); 41978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 42078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 42178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 42278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fcvt, double x, int a, int *b, int *c) { 42378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 42478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fcvt)(x, a, b, c); 42578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 42678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(b, sizeof(*b)); 42778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(c, sizeof(*c)); 42878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 42978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 43078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 43178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 43278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, getenv, char *name) { 43378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 43478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getenv)(name); 43578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_has_dynamic_component()) { 43678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 43778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, REAL(strlen)(res) + 1); 43878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 43978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 44078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 44178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 44278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) { 44378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 44478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat)(magic, fd, buf); 44578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 44678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_stat_sz); 44778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 44878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 44978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 45078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) { 45178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 45278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__fxstat64)(magic, fd, buf); 45378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 45478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_stat64_sz); 45578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 45678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 45778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 45878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat, int magic, char *path, void *buf) { 45978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 46078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat)(magic, path, buf); 46178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 46278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_stat_sz); 46378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 46478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 46578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 46678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __xstat64, int magic, char *path, void *buf) { 46778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 46878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__xstat64)(magic, path, buf); 46978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 47078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_stat64_sz); 47178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 47278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 47378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 47478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat, int magic, char *path, void *buf) { 47578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 47678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat)(magic, path, buf); 47778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 47878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_stat_sz); 47978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 48078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 48178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 48278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, __lxstat64, int magic, char *path, void *buf) { 48378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 48478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(__lxstat64)(magic, path, buf); 48578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 48678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_stat64_sz); 48778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 48878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 48978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 49078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, pipe, int pipefd[2]) { 49178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 49278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(pipe)(pipefd); 49378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 49478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(pipe)(pipefd); 49578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 49678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(pipefd, sizeof(int[2])); 49778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 49878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 49978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 50078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, wait, int *status) { 50178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 50278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(wait)(status); 50378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (status) 50478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(status, sizeof(*status)); 50578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 50678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 50878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, waitpid, int pid, int *status, int options) { 50978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 51078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(waitpid)(pid, status, options); 51178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (status) 51278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(status, sizeof(*status)); 51378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 51478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 51578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 51678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets, char *s, int size, void *stream) { 51778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 51878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets)(s, size, stream); 51978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 52078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 52178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 52278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 52378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 52478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, fgets_unlocked, char *s, int size, void *stream) { 52578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 52678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(fgets_unlocked)(s, size, stream); 52778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 52878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, REAL(strlen)(s) + 1); 52978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 53078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 53178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5326afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(char *, getcwd, char *buf, SIZE_T size) { 53378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 53478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(getcwd)(buf, size); 53578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 53678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, REAL(strlen)(buf) + 1); 53778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 53878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 53978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 54078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(char *, realpath, char *path, char *abspath) { 54178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 54278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov char *res = REAL(realpath)(path, abspath); 54378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res) 54478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(abspath, REAL(strlen)(abspath) + 1); 54578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 54678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 54778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 54878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit, int resource, void *rlim) { 54978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 55078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit)(resource, rlim); 55178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 55278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit)(resource, rlim); 55378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 55478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(rlim, __msan::struct_rlimit_sz); 55578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 55678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 55778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 55878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, getrlimit64, int resource, void *rlim) { 55978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_init_is_running) 56078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return REAL(getrlimit64)(resource, rlim); 56178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 56278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(getrlimit64)(resource, rlim); 56378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 56478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(rlim, __msan::struct_rlimit64_sz); 56578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 56678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 56778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 56878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, statfs, const char *s, void *buf) { 56978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 57078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(statfs)(s, buf); 57178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 57278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_statfs_sz); 57378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 57478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 57578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 57678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, fstatfs, int fd, void *buf) { 57778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 57878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(fstatfs)(fd, buf); 57978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 58078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_statfs_sz); 58178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 58278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 58378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 58478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, statfs64, const char *s, void *buf) { 58578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 58678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(statfs64)(s, buf); 58778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 58878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_statfs64_sz); 58978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 59078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 59178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 59278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, fstatfs64, int fd, void *buf) { 59378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 59478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(fstatfs64)(fd, buf); 59578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) 59678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, __msan::struct_statfs64_sz); 59778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 59878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 59978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 60078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, uname, void *utsname) { 60178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 60278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(uname)(utsname); 60378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!res) { 60478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(utsname, __msan::struct_utsname_sz); 60578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 60678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 60778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 60878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 60978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_wait, int epfd, void *events, int maxevents, 61078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout) { 61178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 61278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_wait)(epfd, events, maxevents, timeout); 61378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 61478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(events, __msan::struct_epoll_event_sz * res); 61578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 61678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 61778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 61878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 61978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovINTERCEPTOR(int, epoll_pwait, int epfd, void *events, int maxevents, 62078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int timeout, void *sigmask) { 62178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 62278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int res = REAL(epoll_pwait)(epfd, events, maxevents, timeout, sigmask); 62378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 62478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(events, __msan::struct_epoll_event_sz * res); 62578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 62678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 62778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 62878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6296afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recv, int fd, void *buf, SIZE_T len, int flags) { 63078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6316afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recv)(fd, buf, len, flags); 63278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) 63378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 63478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 63578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 63678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6376afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags, 63878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *srcaddr, void *addrlen) { 63978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6407b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov SIZE_T srcaddr_sz; 6417b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) 6427b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov srcaddr_sz = __msan_get_socklen_t(addrlen); 6436afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvfrom)(fd, buf, len, flags, srcaddr, addrlen); 6447b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (res > 0) { 64578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(buf, res); 6467b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov if (srcaddr) { 6477b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov SIZE_T sz = __msan_get_socklen_t(addrlen); 6487b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz); 6497b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 6507b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 65178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 65278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 65378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6546afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, recvmsg, int fd, struct msghdr *msg, int flags) { 65578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 6566afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(recvmsg)(fd, msg, flags); 65778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res > 0) { 6586afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < __msan_get_msghdr_iovlen(msg); ++i) 65978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(__msan_get_msghdr_iov_iov_base(msg, i), 66078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_get_msghdr_iov_iov_len(msg, i)); 66178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 66278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 66378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 66478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6656afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, calloc, SIZE_T nmemb, SIZE_T size) { 66678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 66778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!msan_inited) { 66878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym. 6696afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany const SIZE_T kCallocPoolSize = 1024; 67078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static uptr calloc_memory_for_dlsym[kCallocPoolSize]; 6716afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany static SIZE_T allocated; 6726afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SIZE_T size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize; 67378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *mem = (void*)&calloc_memory_for_dlsym[allocated]; 67478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov allocated += size_in_words; 67578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(allocated < kCallocPoolSize); 67678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return mem; 67778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 67878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, nmemb * size, sizeof(u64), true); 67978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 68078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6816afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, realloc, void *ptr, SIZE_T size) { 68278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 68378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, ptr, size, sizeof(u64), false); 68478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 68578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6866afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, malloc, SIZE_T size) { 68778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_MALLOC_STACK_TRACE; 68878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanReallocate(&stack, 0, size, sizeof(u64), false); 68978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 69078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6916afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap, void *addr, SIZE_T length, int prot, int flags, 6926afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF_T offset) { 69378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 69478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap)(addr, length, prot, flags, fd, offset); 69578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 69678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 69778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 69878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 69978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7006afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(void *, mmap64, void *addr, SIZE_T length, int prot, int flags, 7016afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany int fd, OFF64_T offset) { 70278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 70378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(mmap64)(addr, length, prot, flags, fd, offset); 70478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (res != (void*)-1) 70578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(res, RoundUpTo(length, GetPageSize())); 70678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 70778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 70878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 709e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstruct dlinfo { 710e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_fname; 711e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_fbase; 712e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *dli_sname; 713e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov void *dli_saddr; 714e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}; 715e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 716e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, dladdr, void *addr, dlinfo *info) { 717e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 718e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(dladdr)(addr, info); 719e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res != 0) { 720e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info, sizeof(*info)); 721e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_fname) 722e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_fname, REAL(strlen)(info->dli_fname) + 1); 723e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info->dli_sname) 724e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(info->dli_sname, REAL(strlen)(info->dli_sname) + 1); 725e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 726e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 727e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 728e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 729e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovINTERCEPTOR(int, getrusage, int who, void *usage) { 730e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov ENSURE_MSAN_INITED(); 731e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int res = REAL(getrusage)(who, usage); 732e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (res == 0) { 733e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_unpoison(usage, __msan::struct_rusage_sz); 734e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov } 735e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov return res; 736e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 737e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 738996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \ 739c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany __msan_unpoison(ptr, size) 740996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) do { } while (false) 741bee7415a86d9437659d09f034c346794bf15c2abEvgeniy Stepanov#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \ 742bee7415a86d9437659d09f034c346794bf15c2abEvgeniy Stepanov do {ctx = 0; (void)ctx; ENSURE_MSAN_INITED();} while (false) 743996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd) do { } while (false) 744996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) do { } while (false) 745996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, name) do { } while (false) // FIXME 746c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#include "sanitizer_common/sanitizer_common_interceptors.h" 747c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 74878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 7496afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memset(void *ptr, int c, SIZE_T n) { 75078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // hack until we have a really fast internal_memset 75178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 75278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 75378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)ptr % 8) == 0 && 75478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (c == 0 || c == -1)) { 75578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Printf("memset %p %zd %x\n", ptr, n, c); 75678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr to_store = c ? -1L : 0L; 75778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *p = (uptr*)ptr; 7586afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 75978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov p[i] = to_store; 76078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ptr; 76178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 76278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memset(ptr, c, n); 76378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 76478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 76578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// static 7666afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *fast_memcpy(void *dst, const void *src, SIZE_T n) { 76778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Same hack as in fast_memset above. 76878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (sizeof(uptr) == 8 && 76978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (n % 8) == 0 && 77078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)dst % 8) == 0 && 77178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ((uptr)src % 8) == 0) { 77278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *d = (uptr*)dst; 77378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr *s = (uptr*)src; 7746afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany for (SIZE_T i = 0; i < n / 8; i++) 77578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov d[i] = s[i]; 77678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return dst; 77778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 77878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return internal_memcpy(dst, src, n); 77978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 78078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 78178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// These interface functions reside here so that they can use 78278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// fast_memset, etc. 78378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_unpoison(void *a, uptr size) { 78478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 78578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 0, size); 78678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 78778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 78878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison(void *a, uptr size) { 78978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 79078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 79178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::flags()->poison_heap_with_zeroes ? 0 : -1, size); 79278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 79378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 79478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_poison_stack(void *a, uptr size) { 79578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(a)) return; 79678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 79778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan::flags()->poison_stack_with_zeroes ? 0 : -1, size); 79878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 79978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 80078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_clear_and_unpoison(void *a, uptr size) { 80178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset(a, 0, size); 80278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memset((void*)MEM_TO_SHADOW((uptr)a), 0, size); 80378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 80478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 80578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_copy_origin(void *dst, const void *src, uptr size) { 80678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!__msan_get_track_origins()) return; 80778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst) || !MEM_IS_APP(src)) return; 80878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr d = MEM_TO_ORIGIN(dst); 80978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr s = MEM_TO_ORIGIN(src); 81078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr beg = d & ~3UL; // align down. 81178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr end = (d + size + 3) & ~3UL; // align up. 81278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov s = s & ~3UL; // align down. 81378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memcpy((void*)beg, (void*)s, end - beg); 81478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 81578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 81678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_copy_poison(void *dst, const void *src, uptr size) { 81778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 81878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 81978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov fast_memcpy((void*)MEM_TO_SHADOW((uptr)dst), 82078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void*)MEM_TO_SHADOW((uptr)src), size); 82178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_origin(dst, src, size); 82278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 82378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 82478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_move_poison(void *dst, const void *src, uptr size) { 82578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(dst)) return; 82678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!MEM_IS_APP(src)) return; 82778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov internal_memmove((void*)MEM_TO_SHADOW((uptr)dst), 82878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void*)MEM_TO_SHADOW((uptr)src), size); 82978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_origin(dst, src, size); 83078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 83178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8326afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memcpy(void *dest, const void *src, SIZE_T n) { 83378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 83478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = fast_memcpy(dest, src, n); 83578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_copy_poison(dest, src, n); 83678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 83778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 83878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8396afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memset(void *s, int c, SIZE_T n) { 84078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 84178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = fast_memset(s, c, n); 84278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(s, n); 84378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 84478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 84578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8466afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryanyvoid *__msan_memmove(void *dest, const void *src, SIZE_T n) { 84778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ENSURE_MSAN_INITED(); 84878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *res = REAL(memmove)(dest, src, n); 84978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_move_poison(dest, src, n); 85078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return res; 85178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 85278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 85378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan { 85478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid InitializeInterceptors() { 85578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static int inited = 0; 85678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK_EQ(inited, 0); 857c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SANITIZER_COMMON_INTERCEPTORS_INIT; 858c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 8598028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap); 8608028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mmap64); 8618028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(posix_memalign); 8628028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(malloc); 8638028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(calloc); 8648028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realloc); 8658028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(free); 8668028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread); 8678028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fread_unlocked); 8688028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readlink); 8698028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(readdir); 8708028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memcpy); 8718028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memset); 8728028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(memmove); 8738028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemset); 8748028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemcpy); 8758028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wmemmove); 8768028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcpy); // NOLINT 8778028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strdup); 8788028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncpy); // NOLINT 8798028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strlen); 8808028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strnlen); 8818028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gcvt); 8828028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strcat); // NOLINT 8838028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strncat); // NOLINT 8848028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtol); 8858028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoll); 8868028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoul); 8878028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strtoull); 888e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtod); 889e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtof); 890e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(strtold); 8918028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vsprintf); 8928028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vsnprintf); 8938028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(vswprintf); 8948028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(sprintf); // NOLINT 8958028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(snprintf); 8968028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(swprintf); 8978028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(strftime); 8988028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstombs); 8998028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(mbstowcs); 9008028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcslen); 9018028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcschr); 9028028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscpy); 9038028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcscmp); 9048028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wcstod); 9058028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getenv); 9068028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(gettimeofday); 9078028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fcvt); 9088028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat); 9098028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat); 9108028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat); 9118028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__fxstat64); 9128028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__xstat64); 9138028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(__lxstat64); 9148028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(pipe); 9158028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(wait); 9168028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(waitpid); 9178028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets); 9188028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fgets_unlocked); 9198028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getcwd); 9208028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(realpath); 9218028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit); 9228028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(getrlimit64); 9238028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(statfs); 9248028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fstatfs); 9258028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(statfs64); 9268028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(fstatfs64); 9278028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(uname); 9288028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_wait); 9298028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(epoll_pwait); 9308028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recv); 9318028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvfrom); 9328028c713085dd36688950f5c7c4342dc126ef206Alexey Samsonov INTERCEPT_FUNCTION(recvmsg); 933e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(dladdr); 934e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov INTERCEPT_FUNCTION(getrusage); 93578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov inited = 1; 93678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 93778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} // namespace __msan 938