sanitizer_common_interceptors.inc revision cf39032f101dfb3b97b1dfc7b6d03f5d89dff266
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 3167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#if SANITIZER_INTERCEPT_STRCMP 3267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonovstatic inline int CharCmpX(unsigned char c1, unsigned char c2) { 3367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov return (c1 == c2) ? 0 : (c1 < c2) ? -1 : 1; 3467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov} 3567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov 3667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey SamsonovINTERCEPTOR(int, strcmp, const char *s1, const char *s2) { 3767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov void *ctx; 3867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov COMMON_INTERCEPTOR_ENTER(ctx, strcmp, s1, s2); 3967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov unsigned char c1, c2; 4067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov uptr i; 4167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov for (i = 0; ; i++) { 4267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov c1 = (unsigned char)s1[i]; 4367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov c2 = (unsigned char)s2[i]; 4467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov if (c1 != c2 || c1 == '\0') break; 4567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov } 4667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov COMMON_INTERCEPTOR_READ_RANGE(ctx, s1, i + 1); 4767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, i + 1); 4867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov return CharCmpX(c1, c2); 4967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov} 5067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov 5167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey SamsonovINTERCEPTOR(int, strncmp, const char *s1, const char *s2, uptr size) { 5267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov void *ctx; 5367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov COMMON_INTERCEPTOR_ENTER(ctx, strncmp, s1, s2, size); 5467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov unsigned char c1 = 0, c2 = 0; 5567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov uptr i; 5667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov for (i = 0; i < size; i++) { 5767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov c1 = (unsigned char)s1[i]; 5867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov c2 = (unsigned char)s2[i]; 5967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov if (c1 != c2 || c1 == '\0') break; 6067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov } 6167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov COMMON_INTERCEPTOR_READ_RANGE(ctx, s1, Min(i + 1, size)); 6267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, Min(i + 1, size)); 6367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov return CharCmpX(c1, c2); 6467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov} 6567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov 6667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#define INIT_STRCMP INTERCEPT_FUNCTION(strcmp) 6767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#define INIT_STRNCMP INTERCEPT_FUNCTION(strncmp) 6867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#else 6967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#define INIT_STRCMP 7067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#define INIT_STRNCMP 7167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov#endif 7267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov 73be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#if SANITIZER_INTERCEPT_STRCASECMP 74be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukovstatic inline int CharCaseCmp(unsigned char c1, unsigned char c2) { 75be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov int c1_low = ToLower(c1); 76be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov int c2_low = ToLower(c2); 77be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov return c1_low - c2_low; 78be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov} 79be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov 80be52366ff2500f11133fd6089f349e93bd5f4822Dmitry VyukovINTERCEPTOR(int, strcasecmp, const char *s1, const char *s2) { 81be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov void *ctx; 82be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, strcasecmp, s1, s2); 83be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov unsigned char c1 = 0, c2 = 0; 84be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov uptr i; 85be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov for (i = 0; ; i++) { 86be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov c1 = (unsigned char)s1[i]; 87be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov c2 = (unsigned char)s2[i]; 88be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov if (CharCaseCmp(c1, c2) != 0 || c1 == '\0') 89be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov break; 90be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov } 91be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov COMMON_INTERCEPTOR_READ_RANGE(ctx, s1, i + 1); 92be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, i + 1); 93be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov return CharCaseCmp(c1, c2); 94be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov} 95be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov 96be52366ff2500f11133fd6089f349e93bd5f4822Dmitry VyukovINTERCEPTOR(int, strncasecmp, const char *s1, const char *s2, SIZE_T n) { 97be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov void *ctx; 98be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, strncasecmp, s1, s2, n); 99be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov unsigned char c1 = 0, c2 = 0; 100be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov uptr i; 101be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov for (i = 0; i < n; i++) { 102be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov c1 = (unsigned char)s1[i]; 103be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov c2 = (unsigned char)s2[i]; 104be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov if (CharCaseCmp(c1, c2) != 0 || c1 == '\0') 105be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov break; 106be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov } 107be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov COMMON_INTERCEPTOR_READ_RANGE(ctx, s1, Min(i + 1, n)); 108be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, Min(i + 1, n)); 109be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov return CharCaseCmp(c1, c2); 110be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov} 111be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov 112be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRCASECMP INTERCEPT_FUNCTION(strcasecmp) 113be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRNCASECMP INTERCEPT_FUNCTION(strncasecmp) 114be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#else 115be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRCASECMP 116be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#define INIT_STRNCASECMP 117be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov#endif 118be52366ff2500f11133fd6089f349e93bd5f4822Dmitry Vyukov 1197cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#if SANITIZER_INTERCEPT_FREXP 1207cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(double, frexp, double x, int *exp) { 1217cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov void *ctx; 1227cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, frexp, x, exp); 1237cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov double res = REAL(frexp)(x, exp); 1247cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp)); 1257cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov return res; 1267cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov} 1277cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 128ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXP INTERCEPT_FUNCTION(frexp); 129ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#else 130ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXP 131ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#endif // SANITIZER_INTERCEPT_FREXP 132ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov 133ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#if SANITIZER_INTERCEPT_FREXPF_FREXPL 1347cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(float, frexpf, float x, int *exp) { 1357cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov void *ctx; 1367cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, frexpf, x, exp); 1377cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov float res = REAL(frexpf)(x, exp); 1387cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp)); 1397cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov return res; 1407cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov} 1417cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 1427cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovINTERCEPTOR(long double, frexpl, long double x, int *exp) { 1437cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov void *ctx; 1447cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, frexpl, x, exp); 1457cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov long double res = REAL(frexpl)(x, exp); 1467cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, exp, sizeof(*exp)); 1477cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov return res; 1487cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov} 1497cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 150ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXPF_FREXPL \ 1517cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov INTERCEPT_FUNCTION(frexpf); \ 1527cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov INTERCEPT_FUNCTION(frexpl) 1537cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#else 154ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#define INIT_FREXPF_FREXPL 155ff5d1fcdd74036fa15d96fafd487397ebf5f202eAlexey Samsonov#endif // SANITIZER_INTERCEPT_FREXPF_FREXPL 1567cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 157b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SI_NOT_WINDOWS 158b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanovstatic void write_iovec(void *ctx, struct __sanitizer_iovec *iovec, 159b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SIZE_T iovlen, SIZE_T maxlen) { 160b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov for (SIZE_T i = 0; i < iovlen && maxlen; ++i) { 161b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T sz = Min(iovec[i].iov_len, maxlen); 162b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iovec[i].iov_base, sz); 163b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov maxlen -= sz; 164b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov } 165b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 166b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 167b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanovstatic void read_iovec(void *ctx, struct __sanitizer_iovec *iovec, 168b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SIZE_T iovlen, SIZE_T maxlen) { 169b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, iovec, sizeof(*iovec) * iovlen); 170b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov for (SIZE_T i = 0; i < iovlen && maxlen; ++i) { 171b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T sz = Min(iovec[i].iov_len, maxlen); 172b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, iovec[i].iov_base, sz); 173b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov maxlen -= sz; 174b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov } 175b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 176b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 177b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 1788ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#if SANITIZER_INTERCEPT_READ 1796afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, read, int fd, void *ptr, SIZE_T count) { 18044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 181996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, read, fd, ptr, count); 1826afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(read)(fd, ptr, count); 1838530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany if (res > 0) 184996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res); 185c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany if (res >= 0 && fd >= 0) 186996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 1878530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany return res; 1888530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany} 18944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_READ INTERCEPT_FUNCTION(read) 190c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 19144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_READ 1928ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#endif 1938530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 194c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#if SANITIZER_INTERCEPT_PREAD 1956afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread, int fd, void *ptr, SIZE_T count, OFF_T offset) { 19644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 197996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, pread, fd, ptr, count, offset); 1986afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(pread)(fd, ptr, count, offset); 1998530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany if (res > 0) 200996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res); 201c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany if (res >= 0 && fd >= 0) 202996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 2038530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany return res; 2048530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany} 20544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD INTERCEPT_FUNCTION(pread) 206c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 20744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD 208c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#endif 2098530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 210b1cc4e448f35515e737ac4969aaa04f3fa3af10aKostya Serebryany#if SANITIZER_INTERCEPT_PREAD64 2116afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread64, int fd, void *ptr, SIZE_T count, OFF64_T offset) { 21244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 213996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, pread64, fd, ptr, count, offset); 2146afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(pread64)(fd, ptr, count, offset); 2158530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany if (res > 0) 216996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, res); 217c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany if (res >= 0 && fd >= 0) 218996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 2198530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany return res; 2208530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany} 22144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD64 INTERCEPT_FUNCTION(pread64) 222c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 22344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PREAD64 2241f5e23e3204961456d4c7a9b45060597d4ff69afAlexander Potapenko#endif 2258530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 226b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SANITIZER_INTERCEPT_READV 227b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovINTERCEPTOR_WITH_SUFFIX(SSIZE_T, readv, int fd, __sanitizer_iovec *iov, 228b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov int iovcnt) { 229b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov void *ctx; 230b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readv, fd, iov, iovcnt); 231b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T res = REAL(readv)(fd, iov, iovcnt); 232b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res > 0) write_iovec(ctx, iov, iovcnt, res); 233b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res >= 0 && fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 234b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov return res; 235b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 236b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_READV INTERCEPT_FUNCTION(readv) 237b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#else 238b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_READV 239b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 240b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 241b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SANITIZER_INTERCEPT_PREADV 242b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovINTERCEPTOR(SSIZE_T, preadv, int fd, __sanitizer_iovec *iov, int iovcnt, 243b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov OFF_T offset) { 244b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov void *ctx; 245b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, preadv, fd, iov, iovcnt, offset); 246b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T res = REAL(preadv)(fd, iov, iovcnt, offset); 247b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res > 0) write_iovec(ctx, iov, iovcnt, res); 248b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res >= 0 && fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 249b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov return res; 250b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 251b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PREADV INTERCEPT_FUNCTION(preadv) 252b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#else 253b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PREADV 254b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 255b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 256b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SANITIZER_INTERCEPT_PREADV64 257b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovINTERCEPTOR(SSIZE_T, preadv64, int fd, __sanitizer_iovec *iov, int iovcnt, 258b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov OFF64_T offset) { 259b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov void *ctx; 260b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, preadv64, fd, iov, iovcnt, offset); 261b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T res = REAL(preadv64)(fd, iov, iovcnt, offset); 262b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res > 0) write_iovec(ctx, iov, iovcnt, res); 263b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res >= 0 && fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 264b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov return res; 265b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 266b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PREADV64 INTERCEPT_FUNCTION(preadv64) 267b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#else 268b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PREADV64 269b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 270b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 271c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_WRITE 272c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(SSIZE_T, write, int fd, void *ptr, SIZE_T count) { 27344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 274996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, write, fd, ptr, count); 275c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (fd >= 0) 276996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); 277c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SSIZE_T res = REAL(write)(fd, ptr, count); 278b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov // FIXME: this check should be _before_ the call to REAL(write), not after 279c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (res > 0) 280996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res); 281c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 282c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 28344be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_WRITE INTERCEPT_FUNCTION(write) 284153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else 28544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_WRITE 286153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif 287153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany 288c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE 289f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry VyukovINTERCEPTOR(SSIZE_T, pwrite, int fd, void *ptr, SIZE_T count, OFF_T offset) { 29044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 291f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, pwrite, fd, ptr, count, offset); 292c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (fd >= 0) 293996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); 294f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov SSIZE_T res = REAL(pwrite)(fd, ptr, count, offset); 295c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (res > 0) 296996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res); 297c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 298c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 29944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE INTERCEPT_FUNCTION(pwrite) 300153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else 30144be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE 302153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif 303153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany 304c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE64 305f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry VyukovINTERCEPTOR(SSIZE_T, pwrite64, int fd, void *ptr, OFF64_T count, 306f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov OFF64_T offset) { 30744be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 308f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, pwrite64, fd, ptr, count, offset); 309c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (fd >= 0) 310996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); 311f0c846b8ef61a5f4bc664c463d643bb8dedc3768Dmitry Vyukov SSIZE_T res = REAL(pwrite64)(fd, ptr, count, offset); 312c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (res > 0) 313996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, res); 314c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 315c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 31644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE64 INTERCEPT_FUNCTION(pwrite64) 317153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else 31844be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PWRITE64 319153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif 320153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany 321b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SANITIZER_INTERCEPT_WRITEV 322b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovINTERCEPTOR_WITH_SUFFIX(SSIZE_T, writev, int fd, __sanitizer_iovec *iov, 323b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov int iovcnt) { 324b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov void *ctx; 325b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, writev, fd, iov, iovcnt); 326b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (fd >= 0) COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); 327b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T res = REAL(writev)(fd, iov, iovcnt); 328b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res > 0) read_iovec(ctx, iov, iovcnt, res); 329b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov return res; 330b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 331b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_WRITEV INTERCEPT_FUNCTION(writev) 332b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#else 333b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_WRITEV 334b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 335b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 336b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SANITIZER_INTERCEPT_PWRITEV 337b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovINTERCEPTOR(SSIZE_T, pwritev, int fd, __sanitizer_iovec *iov, int iovcnt, 338b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov OFF_T offset) { 339b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov void *ctx; 340b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, pwritev, fd, iov, iovcnt, offset); 341b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (fd >= 0) COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); 342b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T res = REAL(pwritev)(fd, iov, iovcnt, offset); 343b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res > 0) read_iovec(ctx, iov, iovcnt, res); 344b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov return res; 345b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 346b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PWRITEV INTERCEPT_FUNCTION(pwritev) 347b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#else 348b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PWRITEV 349b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 350b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 351b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#if SANITIZER_INTERCEPT_PWRITEV64 352b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovINTERCEPTOR(SSIZE_T, pwritev64, int fd, __sanitizer_iovec *iov, int iovcnt, 353b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov OFF64_T offset) { 354b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov void *ctx; 355b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, pwritev64, fd, iov, iovcnt, offset); 356b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (fd >= 0) COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); 357b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov SSIZE_T res = REAL(pwritev64)(fd, iov, iovcnt, offset); 358b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (res > 0) read_iovec(ctx, iov, iovcnt, res); 359b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov return res; 360b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 361b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PWRITEV64 INTERCEPT_FUNCTION(pwritev64) 362b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#else 363b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#define INIT_PWRITEV64 364b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov#endif 365b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 366c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PRCTL 36769b109a665247d424874253b412fe9b5253d1702Evgeniy StepanovINTERCEPTOR(int, prctl, int option, 36869b109a665247d424874253b412fe9b5253d1702Evgeniy Stepanov unsigned long arg2, unsigned long arg3, // NOLINT 36944be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov unsigned long arg4, unsigned long arg5) { // NOLINT 37044be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov void *ctx; 371996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, prctl, option, arg2, arg3, arg4, arg5); 372c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany static const int PR_SET_NAME = 15; 373c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany int res = REAL(prctl(option, arg2, arg3, arg4, arg5)); 374c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (option == PR_SET_NAME) { 375c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany char buff[16]; 37644be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov internal_strncpy(buff, (char *)arg2, 15); 377c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany buff[15] = 0; 378996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, buff); 379c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany } 380c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 381c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 38244be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PRCTL INTERCEPT_FUNCTION(prctl) 383c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 38444be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#define INIT_PRCTL 38544be70b186549d592c952a13aafe79bfeae89f81Evgeniy Stepanov#endif // SANITIZER_INTERCEPT_PRCTL 386996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 387fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov 388fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov#if SANITIZER_INTERCEPT_TIME 389fef660506e9e5703fedfee01d614abd4b741c738Evgeniy StepanovINTERCEPTOR(unsigned long, time, unsigned long *t) { 390fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov void *ctx; 391fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, time, t); 392fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov unsigned long res = REAL(time)(t); 39315832c2afc4f04fa558160441d1b01fb3f0ec08bAlexander Potapenko if (t && res != (unsigned long)-1) { 394fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, t, sizeof(*t)); 395fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov } 396fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov return res; 397fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov} 398fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov#define INIT_TIME \ 399fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov INTERCEPT_FUNCTION(time); 400fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov#else 401fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov#define INIT_TIME 402fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov#endif // SANITIZER_INTERCEPT_TIME 403fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov 404fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov 4059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS 406cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanovstatic void unpoison_tm(void *ctx, __sanitizer_tm *tm) { 407cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tm, sizeof(*tm)); 408cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov if (tm->tm_zone) 409cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tm->tm_zone, 410cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov REAL(strlen(tm->tm_zone)) + 1); 411cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov} 412cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov 413cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy StepanovINTERCEPTOR(__sanitizer_tm *, localtime, unsigned long *timep) { 4149358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, localtime, timep); 416cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov __sanitizer_tm *res = REAL(localtime)(timep); 4179358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4189358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 419cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov unpoison_tm(ctx, res); 4209358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4219358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 423cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy StepanovINTERCEPTOR(__sanitizer_tm *, localtime_r, unsigned long *timep, void *result) { 4249358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4259358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, localtime_r, timep, result); 426cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov __sanitizer_tm *res = REAL(localtime_r)(timep, result); 4279358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4289358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 429cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov unpoison_tm(ctx, res); 4309358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4319358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4329358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 433cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy StepanovINTERCEPTOR(__sanitizer_tm *, gmtime, unsigned long *timep) { 4349358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4359358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gmtime, timep); 436cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov __sanitizer_tm *res = REAL(gmtime)(timep); 4379358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4389358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 439cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov unpoison_tm(ctx, res); 4409358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4419358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4429358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 443cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy StepanovINTERCEPTOR(__sanitizer_tm *, gmtime_r, unsigned long *timep, void *result) { 4449358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4459358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gmtime_r, timep, result); 446cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov __sanitizer_tm *res = REAL(gmtime_r)(timep, result); 4479358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4489358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 449cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov unpoison_tm(ctx, res); 4509358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4519358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4529358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4539358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime, unsigned long *timep) { 4549358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4559358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ctime, timep); 4569358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(ctime)(timep); 4579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4589358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4599358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4609358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4619358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4629358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4639358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime_r, unsigned long *timep, char *result) { 4649358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ctime_r, timep, result); 4669358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(ctime_r)(timep, result); 4679358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4689358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4729358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 473cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy StepanovINTERCEPTOR(char *, asctime, __sanitizer_tm *tm) { 4749358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, asctime, tm); 4769358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(asctime)(tm); 4779358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 478cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, sizeof(*tm)); 4799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4809358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4829358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 483cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy StepanovINTERCEPTOR(char *, asctime_r, __sanitizer_tm *tm, char *result) { 4849358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4859358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, asctime_r, tm, result); 4869358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(asctime_r)(tm, result); 4879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 488cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, sizeof(*tm)); 4899358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4909358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4929358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4939358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS \ 4949358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(localtime); \ 4959358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(localtime_r); \ 4969358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(gmtime); \ 4979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(gmtime_r); \ 4989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(ctime); \ 4999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(ctime_r); \ 5009358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(asctime); \ 5019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(asctime_r); 5029358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#else 5039358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS 5049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#endif // SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS 5059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 506996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANF 507996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5084f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common_interceptors_scanf.inc" 509996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 510c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov#define VSCANF_INTERCEPTOR_IMPL(vname, allowGnuMalloc, ...) \ 5114ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov { \ 5124ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov void *ctx; \ 5134ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, vname, __VA_ARGS__); \ 5144ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_list aq; \ 5154ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_copy(aq, ap); \ 5164ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov int res = REAL(vname)(__VA_ARGS__); \ 5174ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov if (res > 0) \ 518c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov scanf_common(ctx, res, allowGnuMalloc, format, aq); \ 5194ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_end(aq); \ 5204ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov return res; \ 5214ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov } 522996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5234ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vscanf, const char *format, va_list ap) 524c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vscanf, true, format, ap) 525996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5264ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vsscanf, const char *str, const char *format, va_list ap) 527c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vsscanf, true, str, format, ap) 528996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5294ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vfscanf, void *stream, const char *format, va_list ap) 530c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vfscanf, true, stream, format, ap) 531996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5329eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF 5334ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vscanf, const char *format, va_list ap) 534c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vscanf, false, format, ap) 535996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5364ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vsscanf, const char *str, const char *format, 5374ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_list ap) 538c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vsscanf, false, str, format, ap) 5394ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5404ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vfscanf, void *stream, const char *format, va_list ap) 541c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vfscanf, false, stream, format, ap) 5429eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif // SANITIZER_INTERCEPT_ISOC99_SCANF 5434ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5444ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov#define SCANF_INTERCEPTOR_IMPL(name, vname, ...) \ 5454ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov { \ 5464ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov void *ctx; \ 5474ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_list ap; \ 5484ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_start(ap, format); \ 5491c571dffb000ce248fd35f4e30983147a5fc52c7Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, vname, __VA_ARGS__, ap); \ 5504ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov int res = vname(__VA_ARGS__, ap); \ 5514ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_end(ap); \ 5524ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov return res; \ 5534ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov } 5544ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5554ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, scanf, const char *format, ...) 5564ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(scanf, vscanf, format) 5574ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5584ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, fscanf, void *stream, const char *format, ...) 5594ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(fscanf, vfscanf, stream, format) 5604ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5614ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, sscanf, const char *str, const char *format, ...) 5624ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(sscanf, vsscanf, str, format) 5634ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5649eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF 5654ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_scanf, const char *format, ...) 5664ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_scanf, __isoc99_vscanf, format) 5674ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5684ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_fscanf, void *stream, const char *format, ...) 5694ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_fscanf, __isoc99_vfscanf, stream, format) 5704ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5714ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_sscanf, const char *str, const char *format, ...) 5724ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_sscanf, __isoc99_vsscanf, str, format) 5739eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif 574996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 575ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#endif 576996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 577ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#if SANITIZER_INTERCEPT_SCANF 578ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#define INIT_SCANF \ 579ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(scanf); \ 580ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(sscanf); \ 581ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(fscanf); \ 582ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(vscanf); \ 583ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(vsscanf); \ 584ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(vfscanf); 585996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#else 586996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define INIT_SCANF 587996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#endif 588996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 589ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#if SANITIZER_INTERCEPT_ISOC99_SCANF 590ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#define INIT_ISOC99_SCANF \ 591ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_scanf); \ 592ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_sscanf); \ 593ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_fscanf); \ 594ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_vscanf); \ 595ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_vsscanf); \ 596ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_vfscanf); 597ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#else 598ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#define INIT_ISOC99_SCANF 599ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#endif 600745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov 6014e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#if SANITIZER_INTERCEPT_IOCTL 602745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#include "sanitizer_common_interceptors_ioctl.inc" 6034e95e949c335dd92b193ff270754e31d144e53bfEvgeniy StepanovINTERCEPTOR(int, ioctl, int d, unsigned request, void *arg) { 6044e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov void *ctx; 6054e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ioctl, d, request, arg); 6064e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6074e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov CHECK(ioctl_initialized); 6084e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6094e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov // Note: TSan does not use common flags, and they are zero-initialized. 6104e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov // This effectively disables ioctl handling in TSan. 6114e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (!common_flags()->handle_ioctl) 6124e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov return REAL(ioctl)(d, request, arg); 6134e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6144e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov const ioctl_desc *desc = ioctl_lookup(request); 6154e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (!desc) 6164e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov Printf("WARNING: unknown ioctl %x\n", request); 6174e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6184e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (desc) 6194e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov ioctl_common_pre(ctx, desc, d, request, arg); 6204e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov int res = REAL(ioctl)(d, request, arg); 6214e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov // FIXME: some ioctls have different return values for success and failure. 6224e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (desc && res != -1) 6234e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov ioctl_common_post(ctx, desc, res, d, request, arg); 6244e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov return res; 6254e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov} 6264ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov#define INIT_IOCTL \ 6274ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov ioctl_init(); \ 6284ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov INTERCEPT_FUNCTION(ioctl); 6294e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#else 6304e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#define INIT_IOCTL 6314e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#endif 632745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov 633745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov 634103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS 635e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(void *, getpwnam, const char *name) { 636e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 637e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwnam, name); 638e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 639e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *res = REAL(getpwnam)(name); 640e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (res != 0) 641e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_passwd_sz); 642e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 643e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 644e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(void *, getpwuid, u32 uid) { 645e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 646e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwuid, uid); 647e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *res = REAL(getpwuid)(uid); 648e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (res != 0) 649e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_passwd_sz); 650e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 651e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 652103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(void *, getgrnam, const char *name) { 653103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 654103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrnam, name); 655103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 656103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *res = REAL(getgrnam)(name); 657103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (res != 0) 658103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_group_sz); 659103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 660103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 661103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(void *, getgrgid, u32 gid) { 662103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 663103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrgid, gid); 664103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *res = REAL(getgrgid)(gid); 665103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (res != 0) 666103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_group_sz); 667103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 668103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 669103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_AND_FRIENDS \ 670103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwnam); \ 671103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwuid); \ 672103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrnam); \ 673103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrgid); 674e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 675103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_AND_FRIENDS 676e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 677e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 678e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 679103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS 680e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getpwnam_r, const char *name, void *pwd, 681e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 682e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 683e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwnam_r, name, pwd, buf, buflen, result); 684e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 685e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(getpwnam_r)(name, pwd, buf, buflen, result); 686e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 687e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz); 688e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 689e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 690e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 691e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 692e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getpwuid_r, u32 uid, void *pwd, 693e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 694e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 695e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwuid_r, uid, pwd, buf, buflen, result); 696e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(getpwuid_r)(uid, pwd, buf, buflen, result); 697e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 698e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz); 699e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 700e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 701e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 702e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 703103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(int, getgrnam_r, const char *name, void *grp, 704103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 705103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 706103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrnam_r, name, grp, buf, buflen, result); 707103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 708103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov int res = REAL(getgrnam_r)(name, grp, buf, buflen, result); 709103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (!res) { 710103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, grp, struct_group_sz); 711103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 712103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov } 713103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 714103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 715103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(int, getgrgid_r, u32 gid, void *grp, 716103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 717103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 718103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrgid_r, gid, grp, buf, buflen, result); 719103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov int res = REAL(getgrgid_r)(gid, grp, buf, buflen, result); 720103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (!res) { 721103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, grp, struct_group_sz); 722103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 723103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov } 724103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 725103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 726103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_R_AND_FRIENDS \ 727103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwnam_r); \ 728103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwuid_r); \ 729103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrnam_r); \ 730103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrgid_r); 731e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 732103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_R_AND_FRIENDS 733e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 734e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 735e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 736e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_CLOCK_GETTIME 737e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_getres, u32 clk_id, void *tp) { 738e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 739e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, clock_getres, clk_id, tp); 740e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(clock_getres)(clk_id, tp); 7417cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov if (!res && tp) { 742e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz); 743e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 744e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 745e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 746e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_gettime, u32 clk_id, void *tp) { 747e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 748e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, clock_gettime, clk_id, tp); 749e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(clock_gettime)(clk_id, tp); 750e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 751e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz); 752e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 753e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 754e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 755e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_settime, u32 clk_id, const void *tp) { 756e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 757e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, clock_settime, clk_id, tp); 758e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, tp, struct_timespec_sz); 759e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return REAL(clock_settime)(clk_id, tp); 760e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 761e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_CLOCK_GETTIME \ 762e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(clock_getres); \ 763e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(clock_gettime); \ 764e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(clock_settime); 765e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 766e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_CLOCK_GETTIME 767e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 768e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 769e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 770e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETITIMER 771e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getitimer, int which, void *curr_value) { 772e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 773e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getitimer, which, curr_value); 774e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(getitimer)(which, curr_value); 77539d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov if (!res && curr_value) { 776e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, curr_value, struct_itimerval_sz); 777e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 778e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 779e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 780e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, setitimer, int which, const void *new_value, void *old_value) { 781e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 782e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, setitimer, which, new_value, old_value); 78339d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov if (new_value) 78439d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, new_value, struct_itimerval_sz); 785e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(setitimer)(which, new_value, old_value); 786e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res && old_value) { 787e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, old_value, struct_itimerval_sz); 788e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 789e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 790e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 791e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETITIMER \ 792e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(getitimer); \ 793e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(setitimer); 794e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 795e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETITIMER 796e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 797e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 798a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov#if SANITIZER_INTERCEPT_GLOB 799906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanovstatic void unpoison_glob_t(void *ctx, __sanitizer_glob_t *pglob) { 800a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pglob, sizeof(*pglob)); 801a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov // +1 for NULL pointer at the end. 802906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov if (pglob->gl_pathv) 803906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE( 804906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov ctx, pglob->gl_pathv, (pglob->gl_pathc + 1) * sizeof(*pglob->gl_pathv)); 805a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov for (SIZE_T i = 0; i < pglob->gl_pathc; ++i) { 806a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov char *p = pglob->gl_pathv[i]; 807a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, REAL(strlen)(p) + 1); 808a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov } 809a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov} 810a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov 811eaca82cf249021afa31dbc970278f2f28ea2a1aaTimur Iskhodzhanovstatic THREADLOCAL __sanitizer_glob_t* pglob_copy; 8123fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic THREADLOCAL void* glob_ctx; 8133fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8143fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic void wrapped_gl_closedir(void *dir) { 8153fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1); 8163fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov pglob_copy->gl_closedir(dir); 8173fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8183fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8193fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic void *wrapped_gl_readdir(void *dir) { 8203fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1); 8213fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_readdir(dir); 8223fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8233fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8243fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic void *wrapped_gl_opendir(const char *s) { 8253fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1); 8263fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1); 8273fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_opendir(s); 8283fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8293fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8303fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic int wrapped_gl_lstat(const char *s, void *st) { 8313fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 2); 8323fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1); 8333fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_lstat(s, st); 8343fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8353fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8363fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic int wrapped_gl_stat(const char *s, void *st) { 8373fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 2); 8383fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1); 8393fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_stat(s, st); 8403fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8413fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 842a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy StepanovINTERCEPTOR(int, glob, const char *pattern, int flags, 843a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int (*errfunc)(const char *epath, int eerrno), 844906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov __sanitizer_glob_t *pglob) { 845a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov void *ctx; 846a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, glob, pattern, flags, errfunc, pglob); 8473fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov __sanitizer_glob_t glob_copy = {0, 0, 0, 0, wrapped_gl_closedir, 8483fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov wrapped_gl_readdir, wrapped_gl_opendir, 8493fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov wrapped_gl_lstat, wrapped_gl_stat}; 8503fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov if (flags & glob_altdirfunc) { 8513fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 8523fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 8533fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 8543fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 8553fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 8563fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov pglob_copy = &glob_copy; 8573fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov glob_ctx = ctx; 8583fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov } 859a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int res = REAL(glob)(pattern, flags, errfunc, pglob); 8603fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov if (flags & glob_altdirfunc) { 8613fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 8623fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 8633fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 8643fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 8653fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 8663fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov } 8673fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov pglob_copy = 0; 8683fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov glob_ctx = 0; 869906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob); 870a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov return res; 871a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov} 872a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov 873a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy StepanovINTERCEPTOR(int, glob64, const char *pattern, int flags, 874a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int (*errfunc)(const char *epath, int eerrno), 875906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov __sanitizer_glob_t *pglob) { 876a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov void *ctx; 877a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, glob64, pattern, flags, errfunc, pglob); 87857876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov __sanitizer_glob_t glob_copy = {0, 0, 0, 0, wrapped_gl_closedir, 87957876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov wrapped_gl_readdir, wrapped_gl_opendir, 88057876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov wrapped_gl_lstat, wrapped_gl_stat}; 88157876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov if (flags & glob_altdirfunc) { 88257876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 88357876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 88457876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 88557876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 88657876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 88757876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov pglob_copy = &glob_copy; 88857876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov glob_ctx = ctx; 88957876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov } 890a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int res = REAL(glob64)(pattern, flags, errfunc, pglob); 89157876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov if (flags & glob_altdirfunc) { 89257876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 89357876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 89457876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 89557876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 89657876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 89757876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov } 89857876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov pglob_copy = 0; 89957876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov glob_ctx = 0; 900906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob); 901a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov return res; 902a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov} 903906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov#define INIT_GLOB \ 904906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov INTERCEPT_FUNCTION(glob); \ 905a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov INTERCEPT_FUNCTION(glob64); 906906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov#else // SANITIZER_INTERCEPT_GLOB 907a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov#define INIT_GLOB 908906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov#endif // SANITIZER_INTERCEPT_GLOB 909a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov 910897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#if SANITIZER_INTERCEPT_WAIT 9116a659dfd8e717a598f54867aa36c2e4af09d031bAlexander Potapenko// According to sys/wait.h, wait(), waitid(), waitpid() may have symbol version 9126a659dfd8e717a598f54867aa36c2e4af09d031bAlexander Potapenko// suffixes on Darwin. See the declaration of INTERCEPTOR_WITH_SUFFIX for 9136a659dfd8e717a598f54867aa36c2e4af09d031bAlexander Potapenko// details. 9146a659dfd8e717a598f54867aa36c2e4af09d031bAlexander PotapenkoINTERCEPTOR_WITH_SUFFIX(int, wait, int *status) { 915897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 916897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wait, status); 917897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(wait)(status); 918f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (res != -1 && status) 919897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 920897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 921897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 92230e970f769ccf11e61e472c6f8b22f8e866c592fKostya SerebryanyINTERCEPTOR_WITH_SUFFIX(int, waitid, int idtype, int id, void *infop, 92330e970f769ccf11e61e472c6f8b22f8e866c592fKostya Serebryany int options) { 924897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 925897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, waitid, idtype, id, infop, options); 926897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(waitid)(idtype, id, infop, options); 927f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (res != -1 && infop) 928897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, infop, siginfo_t_sz); 929897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 930897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 9316a659dfd8e717a598f54867aa36c2e4af09d031bAlexander PotapenkoINTERCEPTOR_WITH_SUFFIX(int, waitpid, int pid, int *status, int options) { 932897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 933897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, waitpid, pid, status, options); 934897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(waitpid)(pid, status, options); 935f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (res != -1 && status) 936897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 937897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 938897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 939897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy StepanovINTERCEPTOR(int, wait3, int *status, int options, void *rusage) { 940897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 941897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wait3, status, options, rusage); 942897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(wait3)(status, options, rusage); 943897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (res != -1) { 944f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (status) 945f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 946897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (rusage) 947897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, rusage, struct_rusage_sz); 948897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov } 949897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 950897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 951897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy StepanovINTERCEPTOR(int, wait4, int pid, int *status, int options, void *rusage) { 952897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 953897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wait4, pid, status, options, rusage); 954897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(wait4)(pid, status, options, rusage); 955897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (res != -1) { 956f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (status) 957f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 958897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (rusage) 959897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, rusage, struct_rusage_sz); 960897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov } 961897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 962897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 963897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#define INIT_WAIT \ 964897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(wait); \ 965897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(waitid); \ 966897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(waitpid); \ 967897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(wait3); \ 968897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(wait4); 969897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#else 970897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#define INIT_WAIT 971897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#endif 972897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov 9739530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#if SANITIZER_INTERCEPT_INET 9749530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovINTERCEPTOR(char *, inet_ntop, int af, const void *src, char *dst, u32 size) { 9759530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov void *ctx; 9769530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, inet_ntop, af, src, dst, size); 9779530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov uptr sz = __sanitizer_in_addr_sz(af); 9789530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (sz) COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sz); 9799530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov // FIXME: figure out read size based on the address family. 9809530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov char *res = REAL(inet_ntop)(af, src, dst, size); 9819530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (res) 9829530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 9839530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov return res; 9849530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov} 9859530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovINTERCEPTOR(int, inet_pton, int af, const char *src, void *dst) { 9869530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov void *ctx; 9879530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, inet_pton, af, src, dst); 9889530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov // FIXME: figure out read size based on the address family. 9899530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov int res = REAL(inet_pton)(af, src, dst); 9909530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (res == 1) { 9919530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov uptr sz = __sanitizer_in_addr_sz(af); 9929530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (sz) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, sz); 9939530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov } 9949530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov return res; 9959530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov} 9969530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#define INIT_INET \ 9979530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov INTERCEPT_FUNCTION(inet_ntop); \ 9989530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov INTERCEPT_FUNCTION(inet_pton); 9999530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#else 10009530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#define INIT_INET 10019530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#endif 10029530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov 10039d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#if SANITIZER_INTERCEPT_INET 10049d60087654f89e3452841350d9eca97644edca9dEvgeniy StepanovINTERCEPTOR(int, inet_aton, const char *cp, void *dst) { 10059d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov void *ctx; 10069d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, inet_aton, cp, dst); 10079d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov if (cp) COMMON_INTERCEPTOR_READ_RANGE(ctx, cp, REAL(strlen)(cp) + 1); 10089d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov int res = REAL(inet_aton)(cp, dst); 10099d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov if (res != 0) { 10109d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov uptr sz = __sanitizer_in_addr_sz(af_inet); 10119d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov if (sz) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, sz); 10129d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov } 10139d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov return res; 10149d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov} 10159d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#define INIT_INET_ATON INTERCEPT_FUNCTION(inet_aton); 10169d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#else 10179d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#define INIT_INET_ATON 10189d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#endif 10199d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov 102056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#if SANITIZER_INTERCEPT_PTHREAD_GETSCHEDPARAM 102156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy StepanovINTERCEPTOR(int, pthread_getschedparam, uptr thread, int *policy, int *param) { 102256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov void *ctx; 102356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, pthread_getschedparam, thread, policy, param); 102456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov int res = REAL(pthread_getschedparam)(thread, policy, param); 102556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov if (res == 0) { 102656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov if (policy) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, policy, sizeof(*policy)); 102756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov if (param) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, param, sizeof(*param)); 102856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov } 102956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov return res; 103056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov} 103156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#define INIT_PTHREAD_GETSCHEDPARAM INTERCEPT_FUNCTION(pthread_getschedparam); 103256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#else 103356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#define INIT_PTHREAD_GETSCHEDPARAM 103456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#endif 1035897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov 1036447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETADDRINFO 1037447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy StepanovINTERCEPTOR(int, getaddrinfo, char *node, char *service, 1038447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov struct __sanitizer_addrinfo *hints, 1039447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov struct __sanitizer_addrinfo **out) { 1040447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov void *ctx; 1041447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getaddrinfo, node, service, hints, out); 1042447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (node) COMMON_INTERCEPTOR_READ_RANGE(ctx, node, REAL(strlen)(node) + 1); 1043447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (service) 1044447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, service, REAL(strlen)(service) + 1); 1045447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (hints) 1046447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, hints, sizeof(__sanitizer_addrinfo)); 1047447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov int res = REAL(getaddrinfo)(node, service, hints, out); 10483538eb8a245ea4d17824d8a53feb8cecd3358762Evgeniy Stepanov if (res == 0 && out) { 10493538eb8a245ea4d17824d8a53feb8cecd3358762Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, out, sizeof(*out)); 1050447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov struct __sanitizer_addrinfo *p = *out; 1051447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov while (p) { 10523538eb8a245ea4d17824d8a53feb8cecd3358762Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, sizeof(*p)); 1053447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (p->ai_addr) 1054512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->ai_addr, p->ai_addrlen); 1055447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (p->ai_canonname) 1056447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->ai_canonname, 1057447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov REAL(strlen)(p->ai_canonname) + 1); 1058447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov p = p->ai_next; 1059447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov } 1060447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov } 1061447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov return res; 1062447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov} 1063447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#define INIT_GETADDRINFO INTERCEPT_FUNCTION(getaddrinfo); 1064447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#else 1065447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#define INIT_GETADDRINFO 1066447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#endif 1067447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 10689eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETNAMEINFO 10699eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy StepanovINTERCEPTOR(int, getnameinfo, void *sockaddr, unsigned salen, char *host, 10709eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov unsigned hostlen, char *serv, unsigned servlen, int flags) { 10719eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov void *ctx; 10729eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getnameinfo, sockaddr, salen, host, hostlen, 10739eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov serv, servlen, flags); 10749eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov // FIXME: consider adding READ_RANGE(sockaddr, salen) 10759eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov // There is padding in in_addr that may make this too noisy 10769eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov int res = 10779eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov REAL(getnameinfo)(sockaddr, salen, host, hostlen, serv, servlen, flags); 10789eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov if (res == 0) { 10799eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov if (host && hostlen) 10809eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, host, REAL(strlen)(host) + 1); 10819eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov if (serv && servlen) 10829eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, serv, REAL(strlen)(serv) + 1); 10839eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov } 10849eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov return res; 10859eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov} 10869eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#define INIT_GETNAMEINFO INTERCEPT_FUNCTION(getnameinfo); 10879eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#else 10889eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#define INIT_GETNAMEINFO 10899eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#endif 10909eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov 10919f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETSOCKNAME 10929f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy StepanovINTERCEPTOR(int, getsockname, int sock_fd, void *addr, int *addrlen) { 10939f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov void *ctx; 10949f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getsockname, sock_fd, addr, addrlen); 10959f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addrlen, sizeof(*addrlen)); 10969f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov int addrlen_in = *addrlen; 10979f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov int res = REAL(getsockname)(sock_fd, addr, addrlen); 10989f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov if (res == 0) { 10999f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(addrlen_in, *addrlen)); 11009f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov } 11019f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov return res; 11029f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov} 11039f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#define INIT_GETSOCKNAME INTERCEPT_FUNCTION(getsockname); 11049f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#else 11059f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#define INIT_GETSOCKNAME 11069f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#endif 1107447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 110833b1485c3f1ea5a8089473ab1bb962d7bfb41d72Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETHOSTBYNAME || SANITIZER_INTERCEPT_GETHOSTBYNAME_R 11090a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanovstatic void write_hostent(void *ctx, struct __sanitizer_hostent *h) { 11100a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h, sizeof(__sanitizer_hostent)); 11110a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h->h_name) 11120a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h->h_name, REAL(strlen)(h->h_name) + 1); 11130a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char **p = h->h_aliases; 11140a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov while (*p) { 11150a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *p, REAL(strlen)(*p) + 1); 11160a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ++p; 11170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE( 11190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ctx, h->h_aliases, (p - h->h_aliases + 1) * sizeof(*h->h_aliases)); 11200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov p = h->h_addr_list; 11210a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov while (*p) { 11220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *p, h->h_length); 11230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ++p; 11240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE( 11260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ctx, h->h_addr_list, (p - h->h_addr_list + 1) * sizeof(*h->h_addr_list)); 11270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 112833b1485c3f1ea5a8089473ab1bb962d7bfb41d72Evgeniy Stepanov#endif 11290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETHOSTBYNAME 11310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(struct __sanitizer_hostent *, gethostbyname, char *name) { 11320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname, name); 11340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *res = REAL(gethostbyname)(name); 11350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(struct __sanitizer_hostent *, gethostbyaddr, void *addr, int len, 11400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int type) { 11410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyaddr, addr, len, type); 11430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addr, len); 11440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *res = REAL(gethostbyaddr)(addr, len, type); 11450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11491d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry VyukovINTERCEPTOR(struct __sanitizer_hostent *, gethostent, int fake) { 11500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11511d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, gethostent, fake); 11521d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov struct __sanitizer_hostent *res = REAL(gethostent)(fake); 11530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11550a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11560a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11570a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(struct __sanitizer_hostent *, gethostbyname2, char *name, int af) { 11580a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11590a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname2, name, af); 11600a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *res = REAL(gethostbyname2)(name, af); 11610a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11620a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11640a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME \ 11650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostent); \ 11660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyaddr); \ 11670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname); \ 11680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname2); 11690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#else 11700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME 11710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#endif 11720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETHOSTBYNAME_R 11740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostent_r, struct __sanitizer_hostent *ret, char *buf, 11750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov SIZE_T buflen, __sanitizer_hostent **result, int *h_errnop) { 11760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostent_r, ret, buf, buflen, result, 11780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov h_errnop); 11790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = REAL(gethostent_r)(ret, buf, buflen, result, h_errnop); 11800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 11810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 11820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 11830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 11840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11850a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 11860a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 11870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostbyaddr_r, void *addr, int len, int type, 11920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *ret, char *buf, SIZE_T buflen, 11930a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov __sanitizer_hostent **result, int *h_errnop) { 11940a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11950a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyaddr_r, addr, len, type, ret, buf, 11960a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov buflen, result, h_errnop); 11970a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addr, len); 11980a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = REAL(gethostbyaddr_r)(addr, len, type, ret, buf, buflen, result, 11990a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov h_errnop); 12000a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 12010a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 12020a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 12030a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 12040a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12050a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 12060a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 12070a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12080a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 12090a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 12100a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 12110a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostbyname_r, char *name, struct __sanitizer_hostent *ret, 12120a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char *buf, SIZE_T buflen, __sanitizer_hostent **result, 12130a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int *h_errnop) { 12140a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 12150a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname_r, name, ret, buf, buflen, result, 12160a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov h_errnop); 12170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = REAL(gethostbyname_r)(name, ret, buf, buflen, result, h_errnop); 12180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 12190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 12200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 12210a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 12220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 12240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 12250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 12270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 12280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 12290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostbyname2_r, char *name, int af, 12300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *ret, char *buf, SIZE_T buflen, 12310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov __sanitizer_hostent **result, int *h_errnop) { 12320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 12330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname2_r, name, af, ret, buf, buflen, 12340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov result, h_errnop); 12350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = 12360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov REAL(gethostbyname2_r)(name, af, ret, buf, buflen, result, h_errnop); 12370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 12380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 12390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 12400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 12410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 12430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 12440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 12460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 12470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME_R \ 12480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostent_r); \ 12490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyaddr_r); \ 12500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname_r); \ 12510a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname2_r); 12520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#else 12530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME_R 12540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#endif 12550a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 1256f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETSOCKOPT 1257f32be42523a199674ea665a499db131591e64e08Evgeniy StepanovINTERCEPTOR(int, getsockopt, int sockfd, int level, int optname, void *optval, 1258f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov int *optlen) { 1259f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov void *ctx; 1260f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getsockopt, sockfd, level, optname, optval, 1261f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov optlen); 1262f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov if (optlen) COMMON_INTERCEPTOR_READ_RANGE(ctx, optlen, sizeof(*optlen)); 1263f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov int res = REAL(getsockopt)(sockfd, level, optname, optval, optlen); 1264f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov if (res == 0) 1265f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov if (optval && optlen) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, optval, *optlen); 1266f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov return res; 1267f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov} 1268f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#define INIT_GETSOCKOPT INTERCEPT_FUNCTION(getsockopt); 1269f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#else 1270f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#define INIT_GETSOCKOPT 1271f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#endif 1272f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov 12739d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#if SANITIZER_INTERCEPT_ACCEPT 12749d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovINTERCEPTOR(int, accept, int fd, void *addr, unsigned *addrlen) { 12759d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov void *ctx; 12769d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, accept, fd, addr, addrlen); 12779d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov unsigned addrlen0; 12789d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addrlen) { 12799d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addrlen, sizeof(*addrlen)); 12809d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov addrlen0 = *addrlen; 12819d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 12829d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int fd2 = REAL(accept)(fd, addr, addrlen); 12839d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd2 >= 0) { 12849d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd >= 0) 12859d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, fd2); 12869d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addr && addrlen) 12879d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(*addrlen, addrlen0)); 12889d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 12899d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov return fd2; 12909d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov} 12919d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT INTERCEPT_FUNCTION(accept); 12929d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#else 12939d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT 12949d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#endif 12959d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 12969d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#if SANITIZER_INTERCEPT_ACCEPT4 12979d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovINTERCEPTOR(int, accept4, int fd, void *addr, unsigned *addrlen, int f) { 12989d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov void *ctx; 12999d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, accept4, fd, addr, addrlen, f); 13009d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov unsigned addrlen0; 13019d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addrlen) { 13029d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addrlen, sizeof(*addrlen)); 13039d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov addrlen0 = *addrlen; 13049d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 13059d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int fd2 = REAL(accept4)(fd, addr, addrlen, f); 13069d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd2 >= 0) { 13079d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd >= 0) 13089d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, fd2); 13099d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addr && addrlen) 13109d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(*addrlen, addrlen0)); 13119d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 13129d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov return fd2; 13139d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov} 13149d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT4 INTERCEPT_FUNCTION(accept4); 13159d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#else 13169d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT4 13179d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#endif 13189d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 1319c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#if SANITIZER_INTERCEPT_MODF 1320c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovINTERCEPTOR(double, modf, double x, double *iptr) { 1321c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov void *ctx; 1322c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, modf, x, iptr); 1323c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov double res = REAL(modf)(x, iptr); 1324c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov if (iptr) { 1325c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iptr, sizeof(*iptr)); 1326c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov } 1327c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov return res; 1328c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1329c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovINTERCEPTOR(float, modff, float x, float *iptr) { 1330c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov void *ctx; 1331c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, modff, x, iptr); 1332c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov float res = REAL(modff)(x, iptr); 1333c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov if (iptr) { 1334c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iptr, sizeof(*iptr)); 1335c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov } 1336c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov return res; 1337c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1338c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovINTERCEPTOR(long double, modfl, long double x, long double *iptr) { 1339c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov void *ctx; 1340c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, modfl, x, iptr); 1341c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov long double res = REAL(modfl)(x, iptr); 1342c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov if (iptr) { 1343c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iptr, sizeof(*iptr)); 1344c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov } 1345c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov return res; 1346c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1347c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#define INIT_MODF \ 1348c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INTERCEPT_FUNCTION(modf); \ 1349c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INTERCEPT_FUNCTION(modff); \ 1350c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INTERCEPT_FUNCTION(modfl); 1351c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#else 1352c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#define INIT_MODF 1353c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#endif 1354c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov 13559666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#if SANITIZER_INTERCEPT_RECVMSG 1356eb7c24bb2e6fd20410d34006759caf76852d0600Evgeniy Stepanovstatic void write_msghdr(void *ctx, struct __sanitizer_msghdr *msg, 1357eb7c24bb2e6fd20410d34006759caf76852d0600Evgeniy Stepanov SSIZE_T maxlen) { 13589666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg, sizeof(*msg)); 13599666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (msg->msg_name) 13609666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_name, 13619666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov REAL(strlen)((char *)msg->msg_name) + 1); 13629666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (msg->msg_iov) 1363b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_iov, 1364b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov sizeof(*msg->msg_iov) * msg->msg_iovlen); 1365b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov write_iovec(ctx, msg->msg_iov, msg->msg_iovlen, maxlen); 13669666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (msg->msg_control) 13679666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_control, msg->msg_controllen); 13689666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov} 13699666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov 13709666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy StepanovINTERCEPTOR(SSIZE_T, recvmsg, int fd, struct __sanitizer_msghdr *msg, 13719666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov int flags) { 13729666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov void *ctx; 13739666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, recvmsg, fd, msg, flags); 13749666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov SSIZE_T res = REAL(recvmsg)(fd, msg, flags); 13759666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (res >= 0) { 13769666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 1377b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (msg) write_msghdr(ctx, msg, res); 13789666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov } 13799666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov return res; 13809666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov} 13819666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#define INIT_RECVMSG INTERCEPT_FUNCTION(recvmsg); 13829666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#else 13839666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#define INIT_RECVMSG 13849666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#endif 13859666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov 1386bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPEERNAME 1387bc33e138d82759074f8333239f96506027731e20Evgeniy StepanovINTERCEPTOR(int, getpeername, int sockfd, void *addr, unsigned *addrlen) { 1388bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov void *ctx; 1389bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpeername, sockfd, addr, addrlen); 1390bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov unsigned addr_sz; 1391bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov if (addrlen) addr_sz = *addrlen; 1392bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov int res = REAL(getpeername)(sockfd, addr, addrlen); 1393bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov if (!res && addr && addrlen) 1394bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(addr_sz, *addrlen)); 1395bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov return res; 1396bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov} 1397bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#define INIT_GETPEERNAME INTERCEPT_FUNCTION(getpeername); 1398bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#else 1399bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#define INIT_GETPEERNAME 1400bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#endif 1401bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov 1402359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#if SANITIZER_INTERCEPT_SYSINFO 1403359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy StepanovINTERCEPTOR(int, sysinfo, void *info) { 1404359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov void *ctx; 1405359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sysinfo, info); 1406359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov int res = REAL(sysinfo)(info); 1407359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov if (!res && info) 1408359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, info, struct_sysinfo_sz); 1409359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov return res; 1410359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov} 1411359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#define INIT_SYSINFO INTERCEPT_FUNCTION(sysinfo); 1412359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#else 1413359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#define INIT_SYSINFO 1414359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#endif 1415359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov 1416b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#if SANITIZER_INTERCEPT_READDIR 1417a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy StepanovINTERCEPTOR(__sanitizer_dirent *, readdir, void *dirp) { 1418b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1419b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir, dirp); 1420a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov __sanitizer_dirent *res = REAL(readdir)(dirp); 1421b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (res) 1422a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, res->d_reclen); 1423b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1424b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1425b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 142652d08d8412bfa4ccfa38384d781b51e8774807a7Alexey SamsonovINTERCEPTOR(int, readdir_r, void *dirp, __sanitizer_dirent *entry, 142752d08d8412bfa4ccfa38384d781b51e8774807a7Alexey Samsonov __sanitizer_dirent **result) { 1428b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1429b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir_r, dirp, entry, result); 1430b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov int res = REAL(readdir_r)(dirp, entry, result); 1431b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (!res) { 14325a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 14335a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth if (*result) 14345a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *result, (*result)->d_reclen); 1435b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov } 1436b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1437b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1438b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1439b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR \ 1440b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir); \ 1441b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir_r); 1442b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#else 1443b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR 1444b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#endif 1445b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1446b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#if SANITIZER_INTERCEPT_READDIR64 1447a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy StepanovINTERCEPTOR(__sanitizer_dirent64 *, readdir64, void *dirp) { 1448b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1449b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir64, dirp); 1450a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov __sanitizer_dirent64 *res = REAL(readdir64)(dirp); 1451b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (res) 1452a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, res->d_reclen); 1453b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1454b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1455b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 145652d08d8412bfa4ccfa38384d781b51e8774807a7Alexey SamsonovINTERCEPTOR(int, readdir64_r, void *dirp, __sanitizer_dirent64 *entry, 145752d08d8412bfa4ccfa38384d781b51e8774807a7Alexey Samsonov __sanitizer_dirent64 **result) { 1458b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1459b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir64_r, dirp, entry, result); 1460b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov int res = REAL(readdir64_r)(dirp, entry, result); 1461b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (!res) { 14625a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 14635a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth if (*result) 14645a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *result, (*result)->d_reclen); 1465b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov } 1466b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1467b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1468b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR64 \ 1469b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir64); \ 1470b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir64_r); 1471b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#else 1472b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR64 1473b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#endif 1474b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1475341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if SANITIZER_INTERCEPT_PTRACE 1476341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy StepanovINTERCEPTOR(uptr, ptrace, int request, int pid, void *addr, void *data) { 1477341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov void *ctx; 1478341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ptrace, request, pid, addr, data); 1479341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1480341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (data) { 1481341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (request == ptrace_setregs) 1482341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_regs_struct_sz); 1483341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setfpregs) 1484341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_fpregs_struct_sz); 1485341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setfpxregs) 1486341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_fpxregs_struct_sz); 1487341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setsiginfo) 1488341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, siginfo_t_sz); 1489341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setregset) { 1490341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov __sanitizer_iovec *iov = (__sanitizer_iovec *)data; 1491341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, iov->iov_base, iov->iov_len); 1492341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1493341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1494341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1495341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov uptr res = REAL(ptrace)(request, pid, addr, data); 1496341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1497341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (!res && data) { 1498341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // Note that PEEK* requests assing different meaning to the return value. 1499341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // This function does not handle them (nor does it need to). 1500341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (request == ptrace_getregs) 1501341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_regs_struct_sz); 1502341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getfpregs) 1503341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_fpregs_struct_sz); 1504341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getfpxregs) 1505341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_fpxregs_struct_sz); 1506341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getsiginfo) 1507341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, siginfo_t_sz); 1508341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getregset) { 1509341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov __sanitizer_iovec *iov = (__sanitizer_iovec *)data; 1510341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iov->iov_base, iov->iov_len); 1511341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1512341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1513341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov return res; 1514341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov} 1515341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1516341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#define INIT_PTRACE \ 1517341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov INTERCEPT_FUNCTION(ptrace); 1518341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else 1519341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#define INIT_PTRACE 1520341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 1521341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 15223cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#if SANITIZER_INTERCEPT_SETLOCALE 15233cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy StepanovINTERCEPTOR(char *, setlocale, int category, char *locale) { 15243cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov void *ctx; 15253cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, setlocale, category, locale); 15263cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov if (locale) 15273cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, locale, REAL(strlen)(locale) + 1); 1528801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov char *res = REAL(setlocale)(category, locale); 15293cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov if (res) 15303cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 15313cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov return res; 15323cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov} 15333cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov 15343cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#define INIT_SETLOCALE \ 15353cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov INTERCEPT_FUNCTION(setlocale); 15363cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#else 15373cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#define INIT_SETLOCALE 15383cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#endif 15393cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov 1540801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETCWD 1541801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovINTERCEPTOR(char *, getcwd, char *buf, SIZE_T size) { 1542801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov void *ctx; 1543801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getcwd, buf, size); 1544801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov char *res = REAL(getcwd)(buf, size); 1545801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov if (res) 1546801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 1547801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov return res; 1548801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 1549801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GETCWD \ 1550801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INTERCEPT_FUNCTION(getcwd); 1551801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#else 1552801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GETCWD 1553801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#endif 1554801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 1555801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#if SANITIZER_INTERCEPT_GET_CURRENT_DIR_NAME 15561d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry VyukovINTERCEPTOR(char *, get_current_dir_name, int fake) { 1557801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov void *ctx; 15581d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, get_current_dir_name, fake); 15591d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov char *res = REAL(get_current_dir_name)(fake); 1560801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov if (res) 1561801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 1562801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov return res; 1563801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 1564801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 1565801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GET_CURRENT_DIR_NAME \ 1566801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INTERCEPT_FUNCTION(get_current_dir_name); 1567801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#else 1568801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GET_CURRENT_DIR_NAME 1569801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#endif 1570b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1571ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_STRTOIMAX 1572ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(INTMAX_T, strtoimax, const char *nptr, char **endptr, int base) { 1573ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1574ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strtoimax, nptr, endptr, base); 1575ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTMAX_T res = REAL(strtoimax)(nptr, endptr, base); 1576ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov if (endptr) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, endptr, sizeof(*endptr)); 1577ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1578ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1579ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1580ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(INTMAX_T, strtoumax, const char *nptr, char **endptr, int base) { 1581ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1582ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strtoumax, nptr, endptr, base); 1583ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTMAX_T res = REAL(strtoumax)(nptr, endptr, base); 1584ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov if (endptr) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, endptr, sizeof(*endptr)); 1585ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1586ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1587ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1588ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_STRTOIMAX \ 1589ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(strtoimax); \ 1590ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(strtoumax); 1591ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1592ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_STRTOIMAX 1593ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1594ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1595ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_MBSTOWCS 1596ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, mbstowcs, wchar_t *dest, const char *src, SIZE_T len) { 1597ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1598ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, mbstowcs, dest, src, len); 1599ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(mbstowcs)(dest, src, len); 1600098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest) { 1601e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov SIZE_T write_cnt = res + (res < len); 1602e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt * sizeof(wchar_t)); 1603e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1604ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1605ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1606ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1607ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, mbsrtowcs, wchar_t *dest, const char **src, SIZE_T len, 1608ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ps) { 1609ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1610ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, mbsrtowcs, dest, src, len, ps); 1611098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1612098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 16135a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth SIZE_T res = REAL(mbsrtowcs)(dest, src, len, ps); 1614098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T)(-1) && dest && src) { 1615098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov // This function, and several others, may or may not write the terminating 1616098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov // \0 character. They write it iff they clear *src. 1617098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1618e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt * sizeof(wchar_t)); 1619e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1620ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1621ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1622ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1623ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSTOWCS \ 1624ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(mbstowcs); \ 1625ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(mbsrtowcs); 1626ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1627ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSTOWCS 1628ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1629ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1630ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_MBSNRTOWCS 1631ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, mbsnrtowcs, wchar_t *dest, const char **src, SIZE_T nms, 1632ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T len, void *ps) { 1633ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1634ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, mbsnrtowcs, dest, src, nms, len, ps); 1635098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) { 1636ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1637098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (nms) COMMON_INTERCEPTOR_READ_RANGE(ctx, *src, nms); 1638ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov } 1639098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 1640ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(mbsnrtowcs)(dest, src, nms, len, ps); 1641098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T)(-1) && dest && src) { 1642098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1643e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt * sizeof(wchar_t)); 1644e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1645ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1646ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1647ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1648ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSNRTOWCS INTERCEPT_FUNCTION(mbsnrtowcs); 1649ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1650ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSNRTOWCS 1651ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1652ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1653ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_WCSTOMBS 1654ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, wcstombs, char *dest, const wchar_t *src, SIZE_T len) { 1655ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1656ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wcstombs, dest, src, len); 1657ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(wcstombs)(dest, src, len); 1658098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest) { 1659e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov SIZE_T write_cnt = res + (res < len); 1660e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt); 1661e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1662ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1663ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1664ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1665ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, wcsrtombs, char *dest, const wchar_t **src, SIZE_T len, 1666ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ps) { 1667ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1668ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wcsrtombs, dest, src, len, ps); 1669098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1670098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 16715a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth SIZE_T res = REAL(wcsrtombs)(dest, src, len, ps); 1672098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest && src) { 1673098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1674e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt); 1675e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1676ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1677ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1678ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1679ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSTOMBS \ 1680ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(wcstombs); \ 1681ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(wcsrtombs); 1682ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1683ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSTOMBS 1684ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1685ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1686ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_WCSNRTOMBS 1687ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, wcsnrtombs, char *dest, const wchar_t **src, SIZE_T nms, 1688ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T len, void *ps) { 1689ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1690ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wcsnrtombs, dest, src, nms, len, ps); 1691098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) { 1692ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1693098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (nms) COMMON_INTERCEPTOR_READ_RANGE(ctx, *src, nms); 1694ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov } 1695098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 1696ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(wcsnrtombs)(dest, src, nms, len, ps); 1697098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest && src) { 1698098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1699e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt); 1700e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1701ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1702ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1703ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1704ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSNRTOMBS INTERCEPT_FUNCTION(wcsnrtombs); 1705ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1706ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSNRTOMBS 1707ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1708ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1709ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov 1710ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#if SANITIZER_INTERCEPT_TCGETATTR 1711ea72768894e32f367607c2142a7dfab603310da0Evgeniy StepanovINTERCEPTOR(int, tcgetattr, int fd, void *termios_p) { 1712ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov void *ctx; 1713ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, tcgetattr, fd, termios_p); 1714ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov int res = REAL(tcgetattr)(fd, termios_p); 1715ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov if (!res && termios_p) 1716ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, termios_p, struct_termios_sz); 1717ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov return res; 1718ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov} 1719ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov 1720ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#define INIT_TCGETATTR INTERCEPT_FUNCTION(tcgetattr); 1721ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#else 1722ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#define INIT_TCGETATTR 1723ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#endif 1724ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov 172512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 172612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#if SANITIZER_INTERCEPT_REALPATH 172712eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovINTERCEPTOR(char *, realpath, const char *path, char *resolved_path) { 172812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov void *ctx; 172912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, realpath, path, resolved_path); 173012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1); 173112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 173212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // Workaround a bug in glibc where dlsym(RTLD_NEXT, ...) returns the oldest 173312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // version of a versioned symbol. For realpath(), this gives us something 173412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // (called __old_realpath) that does not handle NULL in the second argument. 173512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // Handle it as part of the interceptor. 173612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char *allocated_path = 0; 173712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (!resolved_path) 173812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov allocated_path = resolved_path = (char *)WRAP(malloc)(path_max + 1); 173912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 174012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char *res = REAL(realpath)(path, resolved_path); 174112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (allocated_path && !res) 174212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov WRAP(free)(allocated_path); 174312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 174412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov return res; 174512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov} 174612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_REALPATH INTERCEPT_FUNCTION(realpath); 174712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#else 174812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_REALPATH 174912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#endif 175012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 175112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#if SANITIZER_INTERCEPT_CANONICALIZE_FILE_NAME 175212eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovINTERCEPTOR(char *, canonicalize_file_name, const char *path) { 175312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov void *ctx; 175412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, canonicalize_file_name, path); 175512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1); 175612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char *res = REAL(canonicalize_file_name)(path); 175712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 175812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov return res; 175912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov} 176012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_CANONICALIZE_FILE_NAME INTERCEPT_FUNCTION(canonicalize_file_name); 176112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#else 176212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_CANONICALIZE_FILE_NAME 176312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#endif 176412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 17655ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#if SANITIZER_INTERCEPT_CONFSTR 17665ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy StepanovINTERCEPTOR(SIZE_T, confstr, int name, char *buf, SIZE_T len) { 17675ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov void *ctx; 17685ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, confstr, name, buf, len); 17695ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov SIZE_T res = REAL(confstr)(name, buf, len); 17705ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov if (buf && res) 17715ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, res < len ? res : len); 17725ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov return res; 17735ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov} 17745ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#define INIT_CONFSTR INTERCEPT_FUNCTION(confstr); 17755ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#else 17765ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#define INIT_CONFSTR 17775ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#endif 17785ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov 177984ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#if SANITIZER_INTERCEPT_SCHED_GETAFFINITY 178084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy StepanovINTERCEPTOR(int, sched_getaffinity, int pid, SIZE_T cpusetsize, void *mask) { 178184ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov void *ctx; 178284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sched_getaffinity, pid, cpusetsize, mask); 178384ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov int res = REAL(sched_getaffinity)(pid, cpusetsize, mask); 178484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov if (mask && !res) 178584ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, mask, cpusetsize); 178684ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov return res; 178784ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov} 178884ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#define INIT_SCHED_GETAFFINITY INTERCEPT_FUNCTION(sched_getaffinity); 178984ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#else 179084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#define INIT_SCHED_GETAFFINITY 179184ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#endif 179284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov 17931204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#if SANITIZER_INTERCEPT_STRERROR 17941204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovINTERCEPTOR(char *, strerror, int errnum) { 17951204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov void *ctx; 17961204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strerror, errnum); 17971204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov char *res = REAL(strerror)(errnum); 17981204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov if (res) 17991204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 18001204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov return res; 18011204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov} 18021204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR INTERCEPT_FUNCTION(strerror); 18031204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#else 18041204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR 18051204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#endif 18061204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov 18071204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#if SANITIZER_INTERCEPT_STRERROR_R 18081204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovINTERCEPTOR(char *, strerror_r, int errnum, char *buf, SIZE_T buflen) { 18091204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov void *ctx; 18101204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strerror_r, errnum, buf, buflen); 18111204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov char *res = REAL(strerror_r)(errnum, buf, buflen); 18121204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // There are 2 versions of strerror_r: 18131204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // * POSIX version returns 0 on success, negative error code on failure, 18141204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // writes message to buf. 18151204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // * GNU version returns message pointer, which points to either buf or some 18161204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // static storage. 1817d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov SIZE_T posix_res = (SIZE_T)res; 1818d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov if (posix_res < 1024 || posix_res > (SIZE_T) - 1024) { 18191204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // POSIX version. Spec is not clear on whether buf is NULL-terminated. 1820d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov // At least on OSX, buf contents are valid even when the call fails. 18211204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov SIZE_T sz = internal_strnlen(buf, buflen); 18221204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov if (sz < buflen) ++sz; 18231204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, sz); 1824d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov } else { 18251204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // GNU version. 18261204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 18271204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov } 18281204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov return res; 18291204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov} 18301204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR_R INTERCEPT_FUNCTION(strerror_r); 18311204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#else 18321204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR_R 18331204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#endif 18341204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov 1835224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANDIR 1836224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir_filter_f)(const struct __sanitizer_dirent *); 1837224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir_compar_f)(const struct __sanitizer_dirent **, 1838224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent **); 1839224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1840224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL void *scandir_ctx; 1841224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir_filter_f scandir_filter; 1842224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir_compar_f scandir_compar; 1843224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1844224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir_filter(const struct __sanitizer_dirent *dir) { 1845224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir_ctx, 1); 1846224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, dir, dir->d_reclen); 1847224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir_filter(dir); 1848224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1849224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1850224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir_compar(const struct __sanitizer_dirent **a, 1851224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent **b) { 1852224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir_ctx, 2); 1853224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, a, sizeof(*a)); 1854224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, *a, (*a)->d_reclen); 1855224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, b, sizeof(*b)); 1856224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, *b, (*b)->d_reclen); 1857224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir_compar(a, b); 1858224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1859224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1860224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy StepanovINTERCEPTOR(int, scandir, char *dirp, __sanitizer_dirent ***namelist, 1861224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_filter_f filter, scandir_compar_f compar) { 1862224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov void *ctx; 1863224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, scandir, dirp, namelist, filter, compar); 1864224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (dirp) COMMON_INTERCEPTOR_READ_RANGE(ctx, dirp, REAL(strlen)(dirp) + 1); 18655bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov CHECK_EQ(0, scandir_ctx); 1866224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_ctx = ctx; 1867224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_filter = filter; 1868224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_compar = compar; 1869224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov int res = REAL(scandir)(dirp, namelist, filter ? wrapped_scandir_filter : 0, 1870224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov compar ? wrapped_scandir_compar : 0); 1871224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_ctx = 0; 1872224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_filter = 0; 1873224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_compar = 0; 1874224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (namelist && res > 0) { 1875224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, namelist, sizeof(*namelist)); 1876224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *namelist, sizeof(**namelist) * res); 1877224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov for (int i = 0; i < res; ++i) 1878224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, (*namelist)[i], 1879224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov (*namelist)[i]->d_reclen); 1880224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov } 1881224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return res; 1882224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1883224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR INTERCEPT_FUNCTION(scandir); 1884224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#else 1885224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR 1886224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#endif 1887224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1888224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANDIR64 1889224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir64_filter_f)(const struct __sanitizer_dirent64 *); 1890224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir64_compar_f)(const struct __sanitizer_dirent64 **, 1891224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent64 **); 1892224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1893224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL void *scandir64_ctx; 1894224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir64_filter_f scandir64_filter; 1895224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir64_compar_f scandir64_compar; 1896224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1897224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir64_filter(const struct __sanitizer_dirent64 *dir) { 1898224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir64_ctx, 1); 1899224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, dir, dir->d_reclen); 1900224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir64_filter(dir); 1901224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1902224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1903224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir64_compar(const struct __sanitizer_dirent64 **a, 1904224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent64 **b) { 1905224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir64_ctx, 2); 1906224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, a, sizeof(*a)); 1907224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, *a, (*a)->d_reclen); 1908224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, b, sizeof(*b)); 1909224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, *b, (*b)->d_reclen); 1910224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir64_compar(a, b); 1911224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1912224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1913224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy StepanovINTERCEPTOR(int, scandir64, char *dirp, __sanitizer_dirent64 ***namelist, 1914224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_filter_f filter, scandir64_compar_f compar) { 1915224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov void *ctx; 1916224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, scandir64, dirp, namelist, filter, compar); 1917224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (dirp) COMMON_INTERCEPTOR_READ_RANGE(ctx, dirp, REAL(strlen)(dirp) + 1); 19185bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov CHECK_EQ(0, scandir64_ctx); 1919224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_ctx = ctx; 1920224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_filter = filter; 1921224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_compar = compar; 1922224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov int res = 1923224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov REAL(scandir64)(dirp, namelist, filter ? wrapped_scandir64_filter : 0, 1924224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov compar ? wrapped_scandir64_compar : 0); 1925224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_ctx = 0; 1926224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_filter = 0; 1927224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_compar = 0; 1928224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (namelist && res > 0) { 1929224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, namelist, sizeof(*namelist)); 1930224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *namelist, sizeof(**namelist) * res); 1931224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov for (int i = 0; i < res; ++i) 1932224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, (*namelist)[i], 1933224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov (*namelist)[i]->d_reclen); 1934224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov } 1935224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return res; 1936224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1937224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR64 INTERCEPT_FUNCTION(scandir64); 1938224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#else 1939224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR64 1940224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#endif 1941224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1942edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETGROUPS 1943edff34b5175c6759685da82077c99ee2be017667Evgeniy StepanovINTERCEPTOR(int, getgroups, int size, u32 *lst) { 1944edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov void *ctx; 1945edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgroups, size, lst); 1946edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov int res = REAL(getgroups)(size, lst); 1947edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov if (res && lst) 1948edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lst, res * sizeof(*lst)); 1949edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov return res; 1950edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov} 1951edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#define INIT_GETGROUPS INTERCEPT_FUNCTION(getgroups); 1952edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#else 1953edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#define INIT_GETGROUPS 1954edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#endif 1955edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov 1956e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#if SANITIZER_INTERCEPT_POLL 1957e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanovstatic void read_pollfd(void *ctx, __sanitizer_pollfd *fds, 1958e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov __sanitizer_nfds_t nfds) { 1959e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov for (unsigned i = 0; i < nfds; ++i) { 1960e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, &fds[i].fd, sizeof(fds[i].fd)); 1961e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, &fds[i].events, sizeof(fds[i].events)); 1962e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov } 1963e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1964e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1965e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanovstatic void write_pollfd(void *ctx, __sanitizer_pollfd *fds, 1966e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov __sanitizer_nfds_t nfds) { 1967e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov for (unsigned i = 0; i < nfds; ++i) 19685bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, &fds[i].revents, 19695bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov sizeof(fds[i].revents)); 1970e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1971e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1972e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovINTERCEPTOR(int, poll, __sanitizer_pollfd *fds, __sanitizer_nfds_t nfds, 1973e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int timeout) { 1974e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov void *ctx; 1975e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, poll, fds, nfds, timeout); 1976e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) read_pollfd(ctx, fds, nfds); 1977e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int res = COMMON_INTERCEPTOR_BLOCK_REAL(poll)(fds, nfds, timeout); 1978e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) write_pollfd(ctx, fds, nfds); 1979e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov return res; 1980e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1981e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_POLL INTERCEPT_FUNCTION(poll); 1982e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#else 1983e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_POLL 1984e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#endif 1985e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1986e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#if SANITIZER_INTERCEPT_PPOLL 1987e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovINTERCEPTOR(int, ppoll, __sanitizer_pollfd *fds, __sanitizer_nfds_t nfds, 1988b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov void *timeout_ts, __sanitizer_sigset_t *sigmask) { 1989e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov void *ctx; 1990e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ppoll, fds, nfds, timeout_ts, sigmask); 1991e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) read_pollfd(ctx, fds, nfds); 1992e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (timeout_ts) 1993e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timeout_ts, struct_timespec_sz); 1994b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov // FIXME: read sigmask when all of sigemptyset, etc are intercepted. 1995e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int res = 1996e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_BLOCK_REAL(ppoll)(fds, nfds, timeout_ts, sigmask); 1997e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) write_pollfd(ctx, fds, nfds); 1998e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov return res; 1999e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 2000e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_PPOLL INTERCEPT_FUNCTION(ppoll); 2001e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#else 2002e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_PPOLL 2003e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#endif 2004e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 2005c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#if SANITIZER_INTERCEPT_WORDEXP 2006c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy StepanovINTERCEPTOR(int, wordexp, char *s, __sanitizer_wordexp_t *p, int flags) { 2007c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov void *ctx; 2008c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wordexp, s, p, flags); 2009c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (s) COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1); 2010c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov int res = REAL(wordexp)(s, p, flags); 2011c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (!res && p) { 2012c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, sizeof(*p)); 2013c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (p->we_wordc) 2014c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->we_wordv, 2015c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov sizeof(*p->we_wordv) * p->we_wordc); 2016c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov for (uptr i = 0; i < p->we_wordc; ++i) { 2017c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov char *w = p->we_wordv[i]; 2018c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (w) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, w, REAL(strlen)(w) + 1); 2019c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov } 2020c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov } 2021c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov return res; 2022c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov} 2023c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#define INIT_WORDEXP INTERCEPT_FUNCTION(wordexp); 2024c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#else 2025c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#define INIT_WORDEXP 2026c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#endif 2027c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov 20289a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGWAIT 20299a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigwait, __sanitizer_sigset_t *set, int *sig) { 20309a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20319a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigwait, set, sig); 20329a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 20339a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigwait)(set, sig); 20349a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && sig) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, sig, sizeof(*sig)); 20359a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20369a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20379a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAIT INTERCEPT_FUNCTION(sigwait); 20389a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20399a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAIT 20409a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20419a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20429a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGWAITINFO 20439a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigwaitinfo, __sanitizer_sigset_t *set, void *info) { 20449a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20459a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigwaitinfo, set, info); 20469a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 20479a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigwaitinfo)(set, info); 20489a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (res > 0 && info) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, info, siginfo_t_sz); 20499a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20509a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20519a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAITINFO INTERCEPT_FUNCTION(sigwaitinfo); 20529a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20539a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAITINFO 20549a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20559a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20569a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGTIMEDWAIT 20579a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigtimedwait, __sanitizer_sigset_t *set, void *info, 20589a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *timeout) { 20599a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20609a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigtimedwait, set, info, timeout); 20619a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (timeout) COMMON_INTERCEPTOR_READ_RANGE(ctx, timeout, struct_timespec_sz); 20629a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 20639a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigtimedwait)(set, info, timeout); 20649a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (res > 0 && info) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, info, siginfo_t_sz); 20659a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20669a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20679a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGTIMEDWAIT INTERCEPT_FUNCTION(sigtimedwait); 20689a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20699a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGTIMEDWAIT 20709a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20719a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20729a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGSETOPS 20739a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigemptyset, __sanitizer_sigset_t *set) { 20749a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20759a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigemptyset, set); 20769a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigemptyset)(set); 20779a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && set) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, set, sizeof(*set)); 20789a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20799a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20809a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20819a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigfillset, __sanitizer_sigset_t *set) { 20829a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20839a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigfillset, set); 20849a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigfillset)(set); 20859a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && set) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, set, sizeof(*set)); 20869a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20879a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20889a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGSETOPS \ 20899a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INTERCEPT_FUNCTION(sigemptyset); \ 20909a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INTERCEPT_FUNCTION(sigfillset); 20919a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20929a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGSETOPS 20939a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20949a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20959a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGPENDING 20969a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigpending, __sanitizer_sigset_t *set) { 20979a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20989a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigpending, set); 20999a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigpending)(set); 21009a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && set) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, set, sizeof(*set)); 21019a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 21029a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 21039a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPENDING INTERCEPT_FUNCTION(sigpending); 21049a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 21059a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPENDING 21069a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 21079a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 21089a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGPROCMASK 21099a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigprocmask, int how, __sanitizer_sigset_t *set, 21109a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov __sanitizer_sigset_t *oldset) { 21119a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 21129a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigprocmask, how, set, oldset); 21139a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 21149a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigprocmask)(how, set, oldset); 21159a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && oldset) 21169a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, oldset, sizeof(*oldset)); 21179a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 21189a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 21199a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPROCMASK INTERCEPT_FUNCTION(sigprocmask); 21209a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 21219a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPROCMASK 21229a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 21239a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 21241394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#if SANITIZER_INTERCEPT_BACKTRACE 21251394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy StepanovINTERCEPTOR(int, backtrace, void **buffer, int size) { 21261394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov void *ctx; 21271394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, backtrace, buffer, size); 21281394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov int res = REAL(backtrace)(buffer, size); 21291394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov if (res && buffer) 21301394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buffer, res * sizeof(*buffer)); 21311394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov return res; 21321394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov} 21331394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov 21341394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy StepanovINTERCEPTOR(char **, backtrace_symbols, void **buffer, int size) { 21351394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov void *ctx; 21361394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, backtrace_symbols, buffer, size); 21371394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov if (buffer && size) 21381394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, buffer, size * sizeof(*buffer)); 21391394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov char ** res = REAL(backtrace_symbols)(buffer, size); 21401394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov if (res && size) { 21411394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, size * sizeof(*res)); 21421394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov for (int i = 0; i < size; ++i) 21431394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res[i], REAL(strlen(res[i])) + 1); 21441394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov } 21451394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov return res; 21461394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov} 21471394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#define INIT_BACKTRACE \ 21481394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INTERCEPT_FUNCTION(backtrace); \ 21491394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INTERCEPT_FUNCTION(backtrace_symbols); 21501394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#else 21511394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#define INIT_BACKTRACE 21521394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#endif 21531394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov 215456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#define SANITIZER_COMMON_INTERCEPTORS_INIT \ 215567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov INIT_STRCMP; \ 215667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov INIT_STRNCMP; \ 215756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_STRCASECMP; \ 215856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_STRNCASECMP; \ 215956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_READ; \ 216056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PREAD; \ 216156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PREAD64; \ 2162b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_READV; \ 2163b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PREADV; \ 2164b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PREADV64; \ 216556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_WRITE; \ 216656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PWRITE; \ 216756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PWRITE64; \ 2168b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_WRITEV; \ 2169b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PWRITEV; \ 2170b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PWRITEV64; \ 2171b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PRCTL; \ 217256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_LOCALTIME_AND_FRIENDS; \ 217356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_SCANF; \ 2174ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INIT_ISOC99_SCANF; \ 217556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_FREXP; \ 217656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_FREXPF_FREXPL; \ 217756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GETPWNAM_AND_FRIENDS; \ 217856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GETPWNAM_R_AND_FRIENDS; \ 217956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_CLOCK_GETTIME; \ 218056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GETITIMER; \ 218156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_TIME; \ 218256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GLOB; \ 218356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_WAIT; \ 218456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_INET; \ 2185447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov INIT_PTHREAD_GETSCHEDPARAM; \ 21869f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov INIT_GETADDRINFO; \ 21879eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov INIT_GETNAMEINFO; \ 21880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INIT_GETSOCKNAME; \ 21890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INIT_GETHOSTBYNAME; \ 2190f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov INIT_GETHOSTBYNAME_R; \ 21919d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov INIT_GETSOCKOPT; \ 21929d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov INIT_ACCEPT; \ 2193c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INIT_ACCEPT4; \ 21949666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov INIT_MODF; \ 2195bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov INIT_RECVMSG; \ 2196745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov INIT_GETPEERNAME; \ 21979d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov INIT_IOCTL; \ 2198359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov INIT_INET_ATON; \ 2199b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INIT_SYSINFO; \ 2200b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INIT_READDIR; \ 2201341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov INIT_READDIR64; \ 22023cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov INIT_PTRACE; \ 2203801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INIT_SETLOCALE; \ 2204801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INIT_GETCWD; \ 2205ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_GET_CURRENT_DIR_NAME; \ 2206ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_STRTOIMAX; \ 2207ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_MBSTOWCS; \ 2208ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_MBSNRTOWCS; \ 2209ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_WCSTOMBS; \ 2210ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov INIT_WCSNRTOMBS; \ 221112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov INIT_TCGETATTR; \ 221212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov INIT_REALPATH; \ 22135ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov INIT_CANONICALIZE_FILE_NAME; \ 221484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov INIT_CONFSTR; \ 22151204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov INIT_SCHED_GETAFFINITY; \ 22161204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov INIT_STRERROR; \ 2217224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov INIT_STRERROR_R; \ 2218224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov INIT_SCANDIR; \ 2219edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov INIT_SCANDIR64; \ 2220e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov INIT_GETGROUPS; \ 2221e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov INIT_POLL; \ 2222c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov INIT_PPOLL; \ 22239a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_WORDEXP; \ 22249a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGWAIT; \ 22259a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGWAITINFO; \ 22269a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGTIMEDWAIT; \ 22279a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGSETOPS; \ 22289a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGPENDING; \ 22291394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INIT_SIGPROCMASK; \ 22301394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INIT_BACKTRACE; 2231