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