14f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov//===-- sanitizer_common_interceptors.inc -----------------------*- C++ -*-===//
28530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//
38530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//                     The LLVM Compiler Infrastructure
48530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//
58530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// This file is distributed under the University of Illinois Open Source
68530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// License. See LICENSE.TXT for details.
78530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//
88530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//===----------------------------------------------------------------------===//
98530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//
108530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// Common function interceptors for tools like AddressSanitizer,
118530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// ThreadSanitizer, MemorySanitizer, etc.
128530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//
138530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// This file should be included into the tool's interceptor file,
148530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany// which has to define it's own macros:
158530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//   COMMON_INTERCEPTOR_ENTER
168530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//   COMMON_INTERCEPTOR_READ_RANGE
178530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//   COMMON_INTERCEPTOR_WRITE_RANGE
18c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany//   COMMON_INTERCEPTOR_FD_ACQUIRE
19c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany//   COMMON_INTERCEPTOR_FD_RELEASE
20c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany//   COMMON_INTERCEPTOR_SET_THREAD_NAME
218530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//===----------------------------------------------------------------------===//
226afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany#include "interception/interception.h"
2374737d595c4e3638b980bd88b0492247ae4318faAlexey Samsonov#include "sanitizer_platform_interceptors.h"
24b1cc4e448f35515e737ac4969aaa04f3fa3af10aKostya Serebryany
25996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#include <stdarg.h>
26996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
27348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov#ifdef _WIN32
28348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov#define va_copy(dst, src) ((dst) = (src))
29348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov#endif // _WIN32
30348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov
317cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#if SANITIZER_INTERCEPT_FREXP
327cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(double, frexp, double x, int *exp) {
337cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  void *ctx;
347cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, frexp, x, exp);
357cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double res = REAL(frexp)(x, exp);
367cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp));
377cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  return res;
387cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
397cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
40ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXP INTERCEPT_FUNCTION(frexp);
41ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#else
42ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXP
43ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#endif // SANITIZER_INTERCEPT_FREXP
44ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov
45ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#if SANITIZER_INTERCEPT_FREXPF_FREXPL
467cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(float, frexpf, float x, int *exp) {
477cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  void *ctx;
487cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, frexpf, x, exp);
497cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  float res = REAL(frexpf)(x, exp);
507cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp));
517cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  return res;
527cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
537cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
547cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(long double, frexpl, long double x, int *exp) {
557cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  void *ctx;
567cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, frexpl, x, exp);
577cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  long double res = REAL(frexpl)(x, exp);
587cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp));
597cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  return res;
607cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
617cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
62ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXPF_FREXPL                       \
637cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  INTERCEPT_FUNCTION(frexpf);                    \
647cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  INTERCEPT_FUNCTION(frexpl)
657cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#else
66ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXPF_FREXPL
67ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#endif // SANITIZER_INTERCEPT_FREXPF_FREXPL
687cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
698ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#if SANITIZER_INTERCEPT_READ
706afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, read, int fd, void *ptr, SIZE_T count) {
7144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
72996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, read, fd, ptr, count);
736afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany  SSIZE_T res = REAL(read)(fd, ptr, count);
748530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  if (res > 0)
75996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res);
76c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany  if (res >= 0 && fd >= 0)
77996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
788530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  return res;
798530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany}
8044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_READ INTERCEPT_FUNCTION(read)
81c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
8244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_READ
838ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#endif
848530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany
85c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#if SANITIZER_INTERCEPT_PREAD
866afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread, int fd, void *ptr, SIZE_T count, OFF_T offset) {
8744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
88996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, pread, fd, ptr, count, offset);
896afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany  SSIZE_T res = REAL(pread)(fd, ptr, count, offset);
908530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  if (res > 0)
91996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res);
92c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany  if (res >= 0 && fd >= 0)
93996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
948530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  return res;
958530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany}
9644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD INTERCEPT_FUNCTION(pread)
97c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
9844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD
99c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#endif
1008530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany
101b1cc4e448f35515e737ac4969aaa04f3fa3af10aKostya Serebryany#if SANITIZER_INTERCEPT_PREAD64
1026afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread64, int fd, void *ptr, SIZE_T count, OFF64_T offset) {
10344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
104996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, pread64, fd, ptr, count, offset);
1056afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany  SSIZE_T res = REAL(pread64)(fd, ptr, count, offset);
1068530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  if (res > 0)
107996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res);
108c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany  if (res >= 0 && fd >= 0)
109996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
1108530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  return res;
1118530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany}
11244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD64 INTERCEPT_FUNCTION(pread64)
113c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
11444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD64
1151f5e23e3204961456d4c7a9b45060597d4ff69afAlexander Potapenko#endif
1168530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany
117c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_WRITE
118c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(SSIZE_T, write, int fd, void *ptr, SIZE_T count) {
11944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
120996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, write, fd, ptr, count);
121c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (fd >= 0)
122996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
123c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  SSIZE_T res = REAL(write)(fd, ptr, count);
124c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (res > 0)
125996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res);
126c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
127c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
12844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_WRITE INTERCEPT_FUNCTION(write)
129153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else
13044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_WRITE
131153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif
132153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany
133c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE
134f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry VyukovINTERCEPTOR(SSIZE_T, pwrite, int fd, void *ptr, SIZE_T count, OFF_T offset) {
13544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
136f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  COMMON_INTERCEPTOR_ENTER(ctx, pwrite, fd, ptr, count, offset);
137c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (fd >= 0)
138996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
139f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  SSIZE_T res = REAL(pwrite)(fd, ptr, count, offset);
140c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (res > 0)
141996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res);
142c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
143c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
14444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE INTERCEPT_FUNCTION(pwrite)
145153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else
14644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE
147153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif
148153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany
149c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE64
150f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry VyukovINTERCEPTOR(SSIZE_T, pwrite64, int fd, void *ptr, OFF64_T count,
151f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov            OFF64_T offset) {
15244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
153f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  COMMON_INTERCEPTOR_ENTER(ctx, pwrite64, fd, ptr, count, offset);
154c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (fd >= 0)
155996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
156f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  SSIZE_T res = REAL(pwrite64)(fd, ptr, count, offset);
157c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (res > 0)
158996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res);
159c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
160c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
16144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE64 INTERCEPT_FUNCTION(pwrite64)
162153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else
16344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE64
164153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif
165153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany
166c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PRCTL
16769b109a665247d424874253b412fe9b5253d1702Evgeniy StepanovINTERCEPTOR(int, prctl, int option,
16869b109a665247d424874253b412fe9b5253d1702Evgeniy Stepanov            unsigned long arg2, unsigned long arg3,   // NOLINT
16944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov            unsigned long arg4, unsigned long arg5) { // NOLINT
17044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
171996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, prctl, option, arg2, arg3, arg4, arg5);
172c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  static const int PR_SET_NAME = 15;
173c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  int res = REAL(prctl(option, arg2, arg3, arg4, arg5));
174c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (option == PR_SET_NAME) {
175c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany    char buff[16];
17644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov    internal_strncpy(buff, (char *)arg2, 15);
177c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany    buff[15] = 0;
178996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, buff);
179c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  }
180c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
181c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
18244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PRCTL INTERCEPT_FUNCTION(prctl)
183c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
18444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PRCTL
18544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#endif // SANITIZER_INTERCEPT_PRCTL
186996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
1879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
1889358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, localtime, unsigned long *timep) {
1899358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
1909358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, localtime, timep);
1919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(localtime)(timep);
1929358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
1939358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
1949358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
1959358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
1969358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
1979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
1989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, localtime_r, unsigned long *timep, void *result) {
1999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2009358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, localtime_r, timep, result);
2019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(localtime_r)(timep, result);
2029358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2039358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2069358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2089358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, gmtime, unsigned long *timep) {
2099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, gmtime, timep);
2119358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(gmtime)(timep);
2129358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2139358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2149358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2169358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2179358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2189358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, gmtime_r, unsigned long *timep, void *result) {
2199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2209358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, gmtime_r, timep, result);
2219358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(gmtime_r)(timep, result);
2229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2239358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2249358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2259358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2269358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2279358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2289358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime, unsigned long *timep) {
2299358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2309358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, ctime, timep);
2319358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(ctime)(timep);
2329358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2349358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
2359358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2369358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2379358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2389358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime_r, unsigned long *timep, char *result) {
2399358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2409358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, ctime_r, timep, result);
2419358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(ctime_r)(timep, result);
2429358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2439358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2449358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
2459358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2469358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2479358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2489358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, asctime, void *tm) {
2499358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2509358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, asctime, tm);
2519358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(asctime)(tm);
2529358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2539358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, struct_tm_sz);
2549358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
2559358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2569358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2589358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, asctime_r, void *tm, char *result) {
2599358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2609358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, asctime_r, tm, result);
2619358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(asctime_r)(tm, result);
2629358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2639358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, struct_tm_sz);
2649358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
2659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2669358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2679358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2689358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS               \
2699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(localtime);                 \
2709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(localtime_r);               \
2719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(gmtime);                    \
2729358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(gmtime_r);                  \
2739358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(ctime);                     \
2749358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(ctime_r);                   \
2759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(asctime);                   \
2769358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(asctime_r);
2779358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#else
2789358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS
2799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#endif // SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
2809358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
281996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANF
282996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
2834f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common_interceptors_scanf.inc"
284996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
285c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov#define VSCANF_INTERCEPTOR_IMPL(vname, allowGnuMalloc, ...)                    \
2864ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  {                                                                            \
2874ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    void *ctx;                                                                 \
2884ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    COMMON_INTERCEPTOR_ENTER(ctx, vname, __VA_ARGS__);                         \
2894ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_list aq;                                                                \
2904ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_copy(aq, ap);                                                           \
2914ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    int res = REAL(vname)(__VA_ARGS__);                                        \
2924ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    if (res > 0)                                                               \
293c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov      scanf_common(ctx, res, allowGnuMalloc, format, aq);                      \
2944ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_end(aq);                                                                \
2954ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    return res;                                                                \
2964ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  }
297996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
2984ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vscanf, const char *format, va_list ap)
299c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vscanf, true, format, ap)
300996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3014ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vsscanf, const char *str, const char *format, va_list ap)
302c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vsscanf, true, str, format, ap)
303996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3044ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vfscanf, void *stream, const char *format, va_list ap)
305c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vfscanf, true, stream, format, ap)
306996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3079eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF
3084ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vscanf, const char *format, va_list ap)
309c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vscanf, false, format, ap)
310996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3114ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vsscanf, const char *str, const char *format,
3124ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov            va_list ap)
313c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vsscanf, false, str, format, ap)
3144ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3154ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vfscanf, void *stream, const char *format, va_list ap)
316c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vfscanf, false, stream, format, ap)
3179eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif  // SANITIZER_INTERCEPT_ISOC99_SCANF
3184ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3194ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov#define SCANF_INTERCEPTOR_IMPL(name, vname, ...)                               \
3204ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  {                                                                            \
3214ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    void *ctx;                                                                 \
3224ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    COMMON_INTERCEPTOR_ENTER(ctx, name, __VA_ARGS__);                          \
3234ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_list ap;                                                                \
3244ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_start(ap, format);                                                      \
3254ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    int res = vname(__VA_ARGS__, ap);                                          \
3264ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_end(ap);                                                                \
3274ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    return res;                                                                \
3284ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  }
3294ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3304ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, scanf, const char *format, ...)
3314ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(scanf, vscanf, format)
3324ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3334ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, fscanf, void *stream, const char *format, ...)
3344ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(fscanf, vfscanf, stream, format)
3354ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3364ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, sscanf, const char *str, const char *format, ...)
3374ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(sscanf, vsscanf, str, format)
3384ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3399eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF
3404ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_scanf, const char *format, ...)
3414ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_scanf, __isoc99_vscanf, format)
3424ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3434ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_fscanf, void *stream, const char *format, ...)
3444ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_fscanf, __isoc99_vfscanf, stream, format)
3454ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3464ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_sscanf, const char *str, const char *format, ...)
3474ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_sscanf, __isoc99_vsscanf, str, format)
3489eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif
349996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
35044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_SCANF                                                             \
35144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(scanf);                                                   \
3524ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(sscanf);                                                  \
35344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(fscanf);                                                  \
35444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(vscanf);                                                  \
35544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(vsscanf);                                                 \
3564ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(vfscanf);                                                 \
3574ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_scanf);                                          \
3584ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_sscanf);                                         \
3594ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_fscanf);                                         \
3604ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_vscanf);                                         \
3614ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_vsscanf);                                        \
3624ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_vfscanf);
363996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
364996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#else
365996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define INIT_SCANF
366996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#endif
367996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
36844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define SANITIZER_COMMON_INTERCEPTORS_INIT                                     \
36944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_READ;                                                                   \
37044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PREAD;                                                                  \
37144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PREAD64;                                                                \
37244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PRCTL;                                                                  \
37344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_WRITE;                                                                  \
37444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PWRITE;                                                                 \
37544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PWRITE64;                                                               \
3769358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INIT_LOCALTIME_AND_FRIENDS;                                                  \
3777cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  INIT_SCANF;                                                                  \
378ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov  INIT_FREXP;                                                                  \
379ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov  INIT_FREXPF_FREXPL;
380