sanitizer_common_interceptors.inc revision e4bdda51b3469aa0f6ef6f6c4656419effa48038
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
2730e110edf92303237d471f1cb8e3ad07954fb145Evgeniy Stepanov#if SANITIZER_WINDOWS
28348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov#define va_copy(dst, src) ((dst) = (src))
29348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov#endif // _WIN32
30348bd12af55f560e0822e753788d8a51fa050c3fEvgeniy Stepanov
31be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#if SANITIZER_INTERCEPT_STRCASECMP
32be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukovstatic inline int CharCaseCmp(unsigned char c1, unsigned char c2) {
33be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  int c1_low = ToLower(c1);
34be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  int c2_low = ToLower(c2);
35be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  return c1_low - c2_low;
36be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov}
37be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov
38be52366ff2500f11133fd6089f349e93bd5f4822Dmitry VyukovINTERCEPTOR(int, strcasecmp, const char *s1, const char *s2) {
39be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  void *ctx;
40be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  COMMON_INTERCEPTOR_ENTER(ctx, strcasecmp, s1, s2);
41be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  unsigned char c1 = 0, c2 = 0;
42be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  uptr i;
43be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  for (i = 0; ; i++) {
44be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov    c1 = (unsigned char)s1[i];
45be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov    c2 = (unsigned char)s2[i];
46be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov    if (CharCaseCmp(c1, c2) != 0 || c1 == '\0')
47be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov      break;
48be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  }
49be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  COMMON_INTERCEPTOR_READ_RANGE(ctx, s1, i + 1);
50be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, i + 1);
51be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  return CharCaseCmp(c1, c2);
52be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov}
53be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov
54be52366ff2500f11133fd6089f349e93bd5f4822Dmitry VyukovINTERCEPTOR(int, strncasecmp, const char *s1, const char *s2, SIZE_T n) {
55be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  void *ctx;
56be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  COMMON_INTERCEPTOR_ENTER(ctx, strncasecmp, s1, s2, n);
57be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  unsigned char c1 = 0, c2 = 0;
58be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  uptr i;
59be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  for (i = 0; i < n; i++) {
60be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov    c1 = (unsigned char)s1[i];
61be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov    c2 = (unsigned char)s2[i];
62be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov    if (CharCaseCmp(c1, c2) != 0 || c1 == '\0')
63be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov      break;
64be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  }
65be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  COMMON_INTERCEPTOR_READ_RANGE(ctx, s1, Min(i + 1, n));
66be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, Min(i + 1, n));
67be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  return CharCaseCmp(c1, c2);
68be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov}
69be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov
70be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRCASECMP INTERCEPT_FUNCTION(strcasecmp)
71be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRNCASECMP INTERCEPT_FUNCTION(strncasecmp)
72be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#else
73be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRCASECMP
74be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRNCASECMP
75be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#endif
76be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov
777cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#if SANITIZER_INTERCEPT_FREXP
787cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(double, frexp, double x, int *exp) {
797cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  void *ctx;
807cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, frexp, x, exp);
817cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double res = REAL(frexp)(x, exp);
827cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp));
837cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  return res;
847cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
857cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
86ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXP INTERCEPT_FUNCTION(frexp);
87ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#else
88ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXP
89ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#endif // SANITIZER_INTERCEPT_FREXP
90ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov
91ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#if SANITIZER_INTERCEPT_FREXPF_FREXPL
927cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(float, frexpf, float x, int *exp) {
937cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  void *ctx;
947cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, frexpf, x, exp);
957cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  float res = REAL(frexpf)(x, exp);
967cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp));
977cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  return res;
987cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
997cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
1007cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(long double, frexpl, long double x, int *exp) {
1017cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  void *ctx;
1027cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, frexpl, x, exp);
1037cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  long double res = REAL(frexpl)(x, exp);
1047cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp));
1057cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  return res;
1067cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
1077cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
108ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXPF_FREXPL                       \
1097cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  INTERCEPT_FUNCTION(frexpf);                    \
1107cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  INTERCEPT_FUNCTION(frexpl)
1117cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#else
112ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXPF_FREXPL
113ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#endif // SANITIZER_INTERCEPT_FREXPF_FREXPL
1147cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
1158ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#if SANITIZER_INTERCEPT_READ
1166afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, read, int fd, void *ptr, SIZE_T count) {
11744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
118996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, read, fd, ptr, count);
1196afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany  SSIZE_T res = REAL(read)(fd, ptr, count);
1208530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  if (res > 0)
121996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res);
122c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany  if (res >= 0 && fd >= 0)
123996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
1248530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  return res;
1258530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany}
12644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_READ INTERCEPT_FUNCTION(read)
127c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
12844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_READ
1298ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#endif
1308530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany
131c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#if SANITIZER_INTERCEPT_PREAD
1326afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread, int fd, void *ptr, SIZE_T count, OFF_T offset) {
13344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
134996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, pread, fd, ptr, count, offset);
1356afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany  SSIZE_T res = REAL(pread)(fd, ptr, count, offset);
1368530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  if (res > 0)
137996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res);
138c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany  if (res >= 0 && fd >= 0)
139996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
1408530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  return res;
1418530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany}
14244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD INTERCEPT_FUNCTION(pread)
143c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
14444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD
145c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#endif
1468530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany
147b1cc4e448f35515e737ac4969aaa04f3fa3af10aKostya Serebryany#if SANITIZER_INTERCEPT_PREAD64
1486afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread64, int fd, void *ptr, SIZE_T count, OFF64_T offset) {
14944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
150996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, pread64, fd, ptr, count, offset);
1516afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany  SSIZE_T res = REAL(pread64)(fd, ptr, count, offset);
1528530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  if (res > 0)
153996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res);
154c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany  if (res >= 0 && fd >= 0)
155996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
1568530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany  return res;
1578530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany}
15844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD64 INTERCEPT_FUNCTION(pread64)
159c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
16044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD64
1611f5e23e3204961456d4c7a9b45060597d4ff69afAlexander Potapenko#endif
1628530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany
163c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_WRITE
164c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(SSIZE_T, write, int fd, void *ptr, SIZE_T count) {
16544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
166996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, write, fd, ptr, count);
167c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (fd >= 0)
168996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
169c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  SSIZE_T res = REAL(write)(fd, ptr, count);
170c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (res > 0)
171996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res);
172c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
173c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
17444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_WRITE INTERCEPT_FUNCTION(write)
175153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else
17644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_WRITE
177153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif
178153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany
179c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE
180f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry VyukovINTERCEPTOR(SSIZE_T, pwrite, int fd, void *ptr, SIZE_T count, OFF_T offset) {
18144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
182f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  COMMON_INTERCEPTOR_ENTER(ctx, pwrite, fd, ptr, count, offset);
183c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (fd >= 0)
184996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
185f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  SSIZE_T res = REAL(pwrite)(fd, ptr, count, offset);
186c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (res > 0)
187996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res);
188c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
189c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
19044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE INTERCEPT_FUNCTION(pwrite)
191153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else
19244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE
193153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif
194153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany
195c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE64
196f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry VyukovINTERCEPTOR(SSIZE_T, pwrite64, int fd, void *ptr, OFF64_T count,
197f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov            OFF64_T offset) {
19844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
199f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  COMMON_INTERCEPTOR_ENTER(ctx, pwrite64, fd, ptr, count, offset);
200c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (fd >= 0)
201996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
202f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov  SSIZE_T res = REAL(pwrite64)(fd, ptr, count, offset);
203c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (res > 0)
204996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res);
205c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
206c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
20744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE64 INTERCEPT_FUNCTION(pwrite64)
208153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else
20944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE64
210153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif
211153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany
212c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PRCTL
21369b109a665247d424874253b412fe9b5253d1702Evgeniy StepanovINTERCEPTOR(int, prctl, int option,
21469b109a665247d424874253b412fe9b5253d1702Evgeniy Stepanov            unsigned long arg2, unsigned long arg3,   // NOLINT
21544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov            unsigned long arg4, unsigned long arg5) { // NOLINT
21644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  void *ctx;
217996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, prctl, option, arg2, arg3, arg4, arg5);
218c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  static const int PR_SET_NAME = 15;
219c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  int res = REAL(prctl(option, arg2, arg3, arg4, arg5));
220c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  if (option == PR_SET_NAME) {
221c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany    char buff[16];
22244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov    internal_strncpy(buff, (char *)arg2, 15);
223c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany    buff[15] = 0;
224996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov    COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, buff);
225c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  }
226c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany  return res;
227c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany}
22844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PRCTL INTERCEPT_FUNCTION(prctl)
229c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else
23044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PRCTL
23144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#endif // SANITIZER_INTERCEPT_PRCTL
232996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
2339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
2349358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, localtime, unsigned long *timep) {
2359358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2369358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, localtime, timep);
2379358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(localtime)(timep);
2389358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2399358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2409358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2419358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2429358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2439358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2449358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, localtime_r, unsigned long *timep, void *result) {
2459358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2469358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, localtime_r, timep, result);
2479358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(localtime_r)(timep, result);
2489358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2499358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2509358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2519358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2529358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2539358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2549358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, gmtime, unsigned long *timep) {
2559358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2569358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, gmtime, timep);
2579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(gmtime)(timep);
2589358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2599358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2609358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2619358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2629358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2639358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2649358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, gmtime_r, unsigned long *timep, void *result) {
2659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2669358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, gmtime_r, timep, result);
2679358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *res = REAL(gmtime_r)(timep, result);
2689358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz);
2719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2729358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2739358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2749358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime, unsigned long *timep) {
2759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2769358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, ctime, timep);
2779358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(ctime)(timep);
2789358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2809358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
2819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2829358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2839358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2849358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime_r, unsigned long *timep, char *result) {
2859358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2869358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, ctime_r, timep, result);
2879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(ctime_r)(timep, result);
2889358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2899358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep));
2909358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
2919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
2929358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
2939358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
2949358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, asctime, void *tm) {
2959358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
2969358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, asctime, tm);
2979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(asctime)(tm);
2989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
2999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, struct_tm_sz);
3009358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
3019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
3029358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
3039358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
3049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, asctime_r, void *tm, char *result) {
3059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  void *ctx;
3069358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, asctime_r, tm, result);
3079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  char *res = REAL(asctime_r)(tm, result);
3089358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  if (res) {
3099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, struct_tm_sz);
3109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
3119358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  }
3129358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  return res;
3139358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
3149358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS               \
3159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(localtime);                 \
3169358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(localtime_r);               \
3179358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(gmtime);                    \
3189358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(gmtime_r);                  \
3199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(ctime);                     \
3209358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(ctime_r);                   \
3219358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(asctime);                   \
3229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INTERCEPT_FUNCTION(asctime_r);
3239358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#else
3249358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS
3259358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#endif // SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
3269358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
327996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANF
328996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3294f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common_interceptors_scanf.inc"
330996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
331c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov#define VSCANF_INTERCEPTOR_IMPL(vname, allowGnuMalloc, ...)                    \
3324ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  {                                                                            \
3334ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    void *ctx;                                                                 \
3344ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    COMMON_INTERCEPTOR_ENTER(ctx, vname, __VA_ARGS__);                         \
3354ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_list aq;                                                                \
3364ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_copy(aq, ap);                                                           \
3374ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    int res = REAL(vname)(__VA_ARGS__);                                        \
3384ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    if (res > 0)                                                               \
339c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov      scanf_common(ctx, res, allowGnuMalloc, format, aq);                      \
3404ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_end(aq);                                                                \
3414ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    return res;                                                                \
3424ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  }
343996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3444ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vscanf, const char *format, va_list ap)
345c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vscanf, true, format, ap)
346996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3474ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vsscanf, const char *str, const char *format, va_list ap)
348c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vsscanf, true, str, format, ap)
349996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3504ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vfscanf, void *stream, const char *format, va_list ap)
351c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vfscanf, true, stream, format, ap)
352996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3539eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF
3544ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vscanf, const char *format, va_list ap)
355c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vscanf, false, format, ap)
356996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
3574ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vsscanf, const char *str, const char *format,
3584ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov            va_list ap)
359c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vsscanf, false, str, format, ap)
3604ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3614ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vfscanf, void *stream, const char *format, va_list ap)
362c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vfscanf, false, stream, format, ap)
3639eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif  // SANITIZER_INTERCEPT_ISOC99_SCANF
3644ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3654ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov#define SCANF_INTERCEPTOR_IMPL(name, vname, ...)                               \
3664ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  {                                                                            \
3674ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    void *ctx;                                                                 \
3684ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    COMMON_INTERCEPTOR_ENTER(ctx, name, __VA_ARGS__);                          \
3694ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_list ap;                                                                \
3704ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_start(ap, format);                                                      \
3714ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    int res = vname(__VA_ARGS__, ap);                                          \
3724ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    va_end(ap);                                                                \
3734ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov    return res;                                                                \
3744ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  }
3754ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3764ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, scanf, const char *format, ...)
3774ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(scanf, vscanf, format)
3784ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3794ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, fscanf, void *stream, const char *format, ...)
3804ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(fscanf, vfscanf, stream, format)
3814ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3824ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, sscanf, const char *str, const char *format, ...)
3834ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(sscanf, vsscanf, str, format)
3844ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3859eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF
3864ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_scanf, const char *format, ...)
3874ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_scanf, __isoc99_vscanf, format)
3884ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3894ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_fscanf, void *stream, const char *format, ...)
3904ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_fscanf, __isoc99_vfscanf, stream, format)
3914ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov
3924ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_sscanf, const char *str, const char *format, ...)
3934ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_sscanf, __isoc99_vsscanf, str, format)
3949eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif
395996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
39644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_SCANF                                                             \
39744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(scanf);                                                   \
3984ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(sscanf);                                                  \
39944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(fscanf);                                                  \
40044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(vscanf);                                                  \
40144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INTERCEPT_FUNCTION(vsscanf);                                                 \
4024ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(vfscanf);                                                 \
4034ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_scanf);                                          \
4044ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_sscanf);                                         \
4054ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_fscanf);                                         \
4064ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_vscanf);                                         \
4074ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_vsscanf);                                        \
4084ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov  INTERCEPT_FUNCTION(__isoc99_vfscanf);
409996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
410996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#else
411996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define INIT_SCANF
412996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#endif
413996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
414e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPWNAM_GETPWUID
415e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(void *, getpwnam, const char *name) {
416e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
417e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, getpwnam, name);
418e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1);
419e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *res = REAL(getpwnam)(name);
420e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (res != 0)
421e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_passwd_sz);
422e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
423e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
424e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(void *, getpwuid, u32 uid) {
425e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
426e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, getpwuid, uid);
427e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *res = REAL(getpwuid)(uid);
428e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (res != 0)
429e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_passwd_sz);
430e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
431e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
432e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETPWNAM_GETPWUID                  \
433e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(getpwnam);                 \
434e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(getpwuid);
435e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else
436e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETPWNAM_GETPWUID
437e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif
438e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
439e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
440e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPWNAM_R_GETPWUID_R
441e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getpwnam_r, const char *name, void *pwd,
442e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    char *buf, SIZE_T buflen, void **result) {
443e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
444e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, getpwnam_r, name, pwd, buf, buflen, result);
445e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1);
446e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = REAL(getpwnam_r)(name, pwd, buf, buflen, result);
447e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (!res) {
448e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz);
449e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
450e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  }
451e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
452e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
453e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getpwuid_r, u32 uid, void *pwd,
454e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    char *buf, SIZE_T buflen, void **result) {
455e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
456e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, getpwuid_r, uid, pwd, buf, buflen, result);
457e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = REAL(getpwuid_r)(uid, pwd, buf, buflen, result);
458e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (!res) {
459e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz);
460e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
461e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  }
462e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
463e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
464e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETPWNAM_R_GETPWUID_R                \
465e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(getpwnam_r);                 \
466e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(getpwuid_r);
467e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else
468e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETPWNAM_R_GETPWUID_R
469e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif
470e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
471e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
472e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_CLOCK_GETTIME
473e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_getres, u32 clk_id, void *tp) {
474e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
475e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, clock_getres, clk_id, tp);
476e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = REAL(clock_getres)(clk_id, tp);
477e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (!res) {
478e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz);
479e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  }
480e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
481e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
482e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_gettime, u32 clk_id, void *tp) {
483e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
484e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, clock_gettime, clk_id, tp);
485e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = REAL(clock_gettime)(clk_id, tp);
486e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (!res) {
487e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz);
488e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  }
489e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
490e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
491e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_settime, u32 clk_id, const void *tp) {
492e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
493e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, clock_settime, clk_id, tp);
494e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_READ_RANGE(ctx, tp, struct_timespec_sz);
495e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return REAL(clock_settime)(clk_id, tp);
496e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
497e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_CLOCK_GETTIME                         \
498e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(clock_getres);                \
499e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(clock_gettime);               \
500e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(clock_settime);
501e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else
502e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_CLOCK_GETTIME
503e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif
504e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
505e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
506e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETITIMER
507e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getitimer, int which, void *curr_value) {
508e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
509e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, getitimer, which, curr_value);
510e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = REAL(getitimer)(which, curr_value);
511e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (!res) {
512e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, curr_value, struct_itimerval_sz);
513e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  }
514e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
515e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
516e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, setitimer, int which, const void *new_value, void *old_value) {
517e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  void *ctx;
518e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_ENTER(ctx, setitimer, which, new_value, old_value);
519e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  COMMON_INTERCEPTOR_READ_RANGE(ctx, new_value, struct_itimerval_sz);
520e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = REAL(setitimer)(which, new_value, old_value);
521e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  if (!res && old_value) {
522e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, old_value, struct_itimerval_sz);
523e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  }
524e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  return res;
525e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
526e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETITIMER                             \
527e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(getitimer);                   \
528e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INTERCEPT_FUNCTION(setitimer);
529e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else
530e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETITIMER
531e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif
532e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
533e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
53444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define SANITIZER_COMMON_INTERCEPTORS_INIT                                     \
535be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  INIT_STRCASECMP;                                                             \
536be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov  INIT_STRNCASECMP;                                                            \
53744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_READ;                                                                   \
53844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PREAD;                                                                  \
53944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PREAD64;                                                                \
54044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PRCTL;                                                                  \
54144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_WRITE;                                                                  \
54244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PWRITE;                                                                 \
54344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov  INIT_PWRITE64;                                                               \
5449358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  INIT_LOCALTIME_AND_FRIENDS;                                                  \
5457cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  INIT_SCANF;                                                                  \
546ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov  INIT_FREXP;                                                                  \
547e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INIT_FREXPF_FREXPL;                                                          \
548e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INIT_GETPWNAM_GETPWUID;                                                      \
549e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INIT_GETPWNAM_R_GETPWUID_R;                                                  \
550e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INIT_CLOCK_GETTIME;                                                          \
551e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  INIT_GETITIMER;
552