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