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