sanitizer_common_interceptors.inc revision 1d02bea922d7b47686de5a5ca81a6bcc8905b6f8
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 4069358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, localtime, unsigned long *timep) { 4079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4089358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, localtime, timep); 4099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *res = REAL(localtime)(timep); 4109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4119358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4129358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz); 4139358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4149358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4169358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, localtime_r, unsigned long *timep, void *result) { 4179358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4189358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, localtime_r, timep, result); 4199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *res = REAL(localtime_r)(timep, result); 4209358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4219358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz); 4239358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4249358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4259358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4269358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, gmtime, unsigned long *timep) { 4279358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4289358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gmtime, timep); 4299358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *res = REAL(gmtime)(timep); 4309358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4319358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4329358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz); 4339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4349358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4359358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4369358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(void *, gmtime_r, unsigned long *timep, void *result) { 4379358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4389358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gmtime_r, timep, result); 4399358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *res = REAL(gmtime_r)(timep, result); 4409358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4419358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4429358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_tm_sz); 4439358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4449358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4459358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4469358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime, unsigned long *timep) { 4479358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4489358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ctime, timep); 4499358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(ctime)(timep); 4509358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4519358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4529358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4539358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4549358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4559358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4569358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, ctime_r, unsigned long *timep, char *result) { 4579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4589358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ctime_r, timep, result); 4599358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(ctime_r)(timep, result); 4609358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4619358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timep, sizeof(*timep)); 4629358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4639358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4649358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4669358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, asctime, void *tm) { 4679358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4689358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, asctime, tm); 4699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(asctime)(tm); 4709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, struct_tm_sz); 4729358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4739358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4749358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4769358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovINTERCEPTOR(char *, asctime_r, void *tm, char *result) { 4779358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void *ctx; 4789358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, asctime_r, tm, result); 4799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov char *res = REAL(asctime_r)(tm, result); 4809358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov if (res) { 4819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, tm, struct_tm_sz); 4829358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 4839358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov } 4849358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov return res; 4859358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 4869358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS \ 4879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(localtime); \ 4889358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(localtime_r); \ 4899358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(gmtime); \ 4909358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(gmtime_r); \ 4919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(ctime); \ 4929358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(ctime_r); \ 4939358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(asctime); \ 4949358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov INTERCEPT_FUNCTION(asctime_r); 4959358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#else 4969358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#define INIT_LOCALTIME_AND_FRIENDS 4979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#endif // SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS 4989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 499996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANF 500996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5014f32c0beaa83ffbb84db23d2e6205bee57c39ce1Evgeniy Stepanov#include "sanitizer_common_interceptors_scanf.inc" 502996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 503c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov#define VSCANF_INTERCEPTOR_IMPL(vname, allowGnuMalloc, ...) \ 5044ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov { \ 5054ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov void *ctx; \ 5064ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, vname, __VA_ARGS__); \ 5074ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_list aq; \ 5084ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_copy(aq, ap); \ 5094ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov int res = REAL(vname)(__VA_ARGS__); \ 5104ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov if (res > 0) \ 511c5b4e86e848758856433da2e876c473dd31db55cEvgeniy Stepanov scanf_common(ctx, res, allowGnuMalloc, format, aq); \ 5124ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_end(aq); \ 5134ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov return res; \ 5144ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov } 515996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5164ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vscanf, const char *format, va_list ap) 517c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vscanf, true, format, ap) 518996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5194ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vsscanf, const char *str, const char *format, va_list ap) 520c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vsscanf, true, str, format, ap) 521996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5224ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, vfscanf, void *stream, const char *format, va_list ap) 523c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(vfscanf, true, stream, format, ap) 524996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5259eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF 5264ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vscanf, const char *format, va_list ap) 527c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vscanf, false, format, ap) 528996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 5294ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vsscanf, const char *str, const char *format, 5304ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_list ap) 531c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vsscanf, false, str, format, ap) 5324ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5334ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_vfscanf, void *stream, const char *format, va_list ap) 534c5b4e86e848758856433da2e876c473dd31db55cEvgeniy StepanovVSCANF_INTERCEPTOR_IMPL(__isoc99_vfscanf, false, stream, format, ap) 5359eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif // SANITIZER_INTERCEPT_ISOC99_SCANF 5364ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5374ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov#define SCANF_INTERCEPTOR_IMPL(name, vname, ...) \ 5384ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov { \ 5394ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov void *ctx; \ 5404ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_list ap; \ 5414ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_start(ap, format); \ 5421c571dffb000ce248fd35f4e30983147a5fc52c7Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, vname, __VA_ARGS__, ap); \ 5434ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov int res = vname(__VA_ARGS__, ap); \ 5444ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov va_end(ap); \ 5454ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov return res; \ 5464ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov } 5474ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5484ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, scanf, const char *format, ...) 5494ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(scanf, vscanf, format) 5504ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5514ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, fscanf, void *stream, const char *format, ...) 5524ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(fscanf, vfscanf, stream, format) 5534ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5544ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, sscanf, const char *str, const char *format, ...) 5554ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(sscanf, vsscanf, str, format) 5564ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5579eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#if SANITIZER_INTERCEPT_ISOC99_SCANF 5584ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_scanf, const char *format, ...) 5594ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_scanf, __isoc99_vscanf, format) 5604ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5614ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_fscanf, void *stream, const char *format, ...) 5624ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_fscanf, __isoc99_vfscanf, stream, format) 5634ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy Stepanov 5644ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovINTERCEPTOR(int, __isoc99_sscanf, const char *str, const char *format, ...) 5654ae1adb49f34cf9a9ef854cf04348531608f0eadEvgeniy StepanovSCANF_INTERCEPTOR_IMPL(__isoc99_sscanf, __isoc99_vsscanf, str, format) 5669eab858dfd995cb0432efa18edbcd0e791114be9Alexander Potapenko#endif 567996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 568ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#endif 569996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 570ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#if SANITIZER_INTERCEPT_SCANF 571ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#define INIT_SCANF \ 572ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(scanf); \ 573ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(sscanf); \ 574ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(fscanf); \ 575ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(vscanf); \ 576ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(vsscanf); \ 577ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(vfscanf); 578996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#else 579996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#define INIT_SCANF 580996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov#endif 581996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 582ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#if SANITIZER_INTERCEPT_ISOC99_SCANF 583ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#define INIT_ISOC99_SCANF \ 584ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_scanf); \ 585ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_sscanf); \ 586ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_fscanf); \ 587ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_vscanf); \ 588ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_vsscanf); \ 589ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INTERCEPT_FUNCTION(__isoc99_vfscanf); 590ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#else 591ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#define INIT_ISOC99_SCANF 592ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov#endif 593745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov 5944e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#if SANITIZER_INTERCEPT_IOCTL 595745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#include "sanitizer_common_interceptors_ioctl.inc" 5964e95e949c335dd92b193ff270754e31d144e53bfEvgeniy StepanovINTERCEPTOR(int, ioctl, int d, unsigned request, void *arg) { 5974e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov void *ctx; 5984e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ioctl, d, request, arg); 5994e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6004e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov CHECK(ioctl_initialized); 6014e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6024e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov // Note: TSan does not use common flags, and they are zero-initialized. 6034e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov // This effectively disables ioctl handling in TSan. 6044e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (!common_flags()->handle_ioctl) 6054e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov return REAL(ioctl)(d, request, arg); 6064e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6074e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov const ioctl_desc *desc = ioctl_lookup(request); 6084e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (!desc) 6094e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov Printf("WARNING: unknown ioctl %x\n", request); 6104e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov 6114e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (desc) 6124e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov ioctl_common_pre(ctx, desc, d, request, arg); 6134e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov int res = REAL(ioctl)(d, request, arg); 6144e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov // FIXME: some ioctls have different return values for success and failure. 6154e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov if (desc && res != -1) 6164e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov ioctl_common_post(ctx, desc, res, d, request, arg); 6174e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov return res; 6184e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov} 6194ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov#define INIT_IOCTL \ 6204ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov ioctl_init(); \ 6214ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov INTERCEPT_FUNCTION(ioctl); 6224e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#else 6234e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#define INIT_IOCTL 6244e95e949c335dd92b193ff270754e31d144e53bfEvgeniy Stepanov#endif 625745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov 626745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov 627103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS 628e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(void *, getpwnam, const char *name) { 629e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 630e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwnam, name); 631e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 632e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *res = REAL(getpwnam)(name); 633e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (res != 0) 634e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_passwd_sz); 635e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 636e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 637e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(void *, getpwuid, u32 uid) { 638e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 639e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwuid, uid); 640e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *res = REAL(getpwuid)(uid); 641e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (res != 0) 642e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_passwd_sz); 643e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 644e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 645103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(void *, getgrnam, const char *name) { 646103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 647103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrnam, name); 648103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 649103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *res = REAL(getgrnam)(name); 650103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (res != 0) 651103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_group_sz); 652103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 653103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 654103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(void *, getgrgid, u32 gid) { 655103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 656103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrgid, gid); 657103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *res = REAL(getgrgid)(gid); 658103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (res != 0) 659103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, struct_group_sz); 660103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 661103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 662103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_AND_FRIENDS \ 663103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwnam); \ 664103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwuid); \ 665103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrnam); \ 666103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrgid); 667e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 668103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_AND_FRIENDS 669e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 670e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 671e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 672103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS 673e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getpwnam_r, const char *name, void *pwd, 674e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 675e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 676e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwnam_r, name, pwd, buf, buflen, result); 677e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 678e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(getpwnam_r)(name, pwd, buf, buflen, result); 679e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 680e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz); 681e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 682e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 683e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 684e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 685e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getpwuid_r, u32 uid, void *pwd, 686e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 687e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 688e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpwuid_r, uid, pwd, buf, buflen, result); 689e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(getpwuid_r)(uid, pwd, buf, buflen, result); 690e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 691e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz); 692e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 693e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 694e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 695e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 696103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(int, getgrnam_r, const char *name, void *grp, 697103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 698103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 699103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrnam_r, name, grp, buf, buflen, result); 700103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1); 701103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov int res = REAL(getgrnam_r)(name, grp, buf, buflen, result); 702103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (!res) { 703103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, grp, struct_group_sz); 704103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 705103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov } 706103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 707103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 708103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovINTERCEPTOR(int, getgrgid_r, u32 gid, void *grp, 709103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov char *buf, SIZE_T buflen, void **result) { 710103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov void *ctx; 711103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgrgid_r, gid, grp, buf, buflen, result); 712103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov int res = REAL(getgrgid_r)(gid, grp, buf, buflen, result); 713103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov if (!res) { 714103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, grp, struct_group_sz); 715103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); 716103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov } 717103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov return res; 718103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 719103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_R_AND_FRIENDS \ 720103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwnam_r); \ 721103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getpwuid_r); \ 722103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrnam_r); \ 723103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov INTERCEPT_FUNCTION(getgrgid_r); 724e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 725103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#define INIT_GETPWNAM_R_AND_FRIENDS 726e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 727e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 728e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 729e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_CLOCK_GETTIME 730e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_getres, u32 clk_id, void *tp) { 731e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 732e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, clock_getres, clk_id, tp); 733e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(clock_getres)(clk_id, tp); 7347cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov if (!res && tp) { 735e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz); 736e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 737e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 738e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 739e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_gettime, u32 clk_id, void *tp) { 740e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 741e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, clock_gettime, clk_id, tp); 742e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(clock_gettime)(clk_id, tp); 743e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res) { 744e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz); 745e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 746e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 747e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 748e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, clock_settime, u32 clk_id, const void *tp) { 749e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 750e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, clock_settime, clk_id, tp); 751e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, tp, struct_timespec_sz); 752e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return REAL(clock_settime)(clk_id, tp); 753e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 754e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_CLOCK_GETTIME \ 755e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(clock_getres); \ 756e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(clock_gettime); \ 757e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(clock_settime); 758e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 759e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_CLOCK_GETTIME 760e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 761e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 762e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 763e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETITIMER 764e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, getitimer, int which, void *curr_value) { 765e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 766e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getitimer, which, curr_value); 767e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(getitimer)(which, curr_value); 76839d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov if (!res && curr_value) { 769e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, curr_value, struct_itimerval_sz); 770e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 771e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 772e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 773e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovINTERCEPTOR(int, setitimer, int which, const void *new_value, void *old_value) { 774e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov void *ctx; 775e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, setitimer, which, new_value, old_value); 77639d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov if (new_value) 77739d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, new_value, struct_itimerval_sz); 778e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = REAL(setitimer)(which, new_value, old_value); 779e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov if (!res && old_value) { 780e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, old_value, struct_itimerval_sz); 781e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov } 782e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov return res; 783e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 784e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETITIMER \ 785e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(getitimer); \ 786e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov INTERCEPT_FUNCTION(setitimer); 787e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#else 788e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#define INIT_GETITIMER 789e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#endif 790e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 791a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov#if SANITIZER_INTERCEPT_GLOB 792906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanovstatic void unpoison_glob_t(void *ctx, __sanitizer_glob_t *pglob) { 793a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pglob, sizeof(*pglob)); 794a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov // +1 for NULL pointer at the end. 795906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov if (pglob->gl_pathv) 796906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE( 797906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov ctx, pglob->gl_pathv, (pglob->gl_pathc + 1) * sizeof(*pglob->gl_pathv)); 798a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov for (SIZE_T i = 0; i < pglob->gl_pathc; ++i) { 799a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov char *p = pglob->gl_pathv[i]; 800a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, REAL(strlen)(p) + 1); 801a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov } 802a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov} 803a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov 804eaca82cf249021afa31dbc970278f2f28ea2a1aaTimur Iskhodzhanovstatic THREADLOCAL __sanitizer_glob_t* pglob_copy; 8053fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic THREADLOCAL void* glob_ctx; 8063fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8073fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic void wrapped_gl_closedir(void *dir) { 8083fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1); 8093fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov pglob_copy->gl_closedir(dir); 8103fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8113fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8123fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic void *wrapped_gl_readdir(void *dir) { 8133fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1); 8143fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_readdir(dir); 8153fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8163fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8173fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic void *wrapped_gl_opendir(const char *s) { 8183fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1); 8193fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1); 8203fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_opendir(s); 8213fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8223fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8233fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic int wrapped_gl_lstat(const char *s, void *st) { 8243fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 2); 8253fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1); 8263fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_lstat(s, st); 8273fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8283fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 8293fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanovstatic int wrapped_gl_stat(const char *s, void *st) { 8303fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 2); 8313fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1); 8323fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov return pglob_copy->gl_stat(s, st); 8333fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov} 8343fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov 835a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy StepanovINTERCEPTOR(int, glob, const char *pattern, int flags, 836a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int (*errfunc)(const char *epath, int eerrno), 837906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov __sanitizer_glob_t *pglob) { 838a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov void *ctx; 839a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, glob, pattern, flags, errfunc, pglob); 8403fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov __sanitizer_glob_t glob_copy = {0, 0, 0, 0, wrapped_gl_closedir, 8413fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov wrapped_gl_readdir, wrapped_gl_opendir, 8423fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov wrapped_gl_lstat, wrapped_gl_stat}; 8433fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov if (flags & glob_altdirfunc) { 8443fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 8453fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 8463fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 8473fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 8483fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 8493fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov pglob_copy = &glob_copy; 8503fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov glob_ctx = ctx; 8513fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov } 852a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int res = REAL(glob)(pattern, flags, errfunc, pglob); 8533fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov if (flags & glob_altdirfunc) { 8543fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 8553fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 8563fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 8573fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 8583fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 8593fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov } 8603fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov pglob_copy = 0; 8613fa122e6a8e12db6583793861f6cf776fe1c98a0Evgeniy Stepanov glob_ctx = 0; 862906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob); 863a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov return res; 864a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov} 865a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov 866a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy StepanovINTERCEPTOR(int, glob64, const char *pattern, int flags, 867a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int (*errfunc)(const char *epath, int eerrno), 868906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov __sanitizer_glob_t *pglob) { 869a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov void *ctx; 870a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, glob64, pattern, flags, errfunc, pglob); 87157876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov __sanitizer_glob_t glob_copy = {0, 0, 0, 0, wrapped_gl_closedir, 87257876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov wrapped_gl_readdir, wrapped_gl_opendir, 87357876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov wrapped_gl_lstat, wrapped_gl_stat}; 87457876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov if (flags & glob_altdirfunc) { 87557876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 87657876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 87757876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 87857876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 87957876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 88057876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov pglob_copy = &glob_copy; 88157876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov glob_ctx = ctx; 88257876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov } 883a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov int res = REAL(glob64)(pattern, flags, errfunc, pglob); 88457876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov if (flags & glob_altdirfunc) { 88557876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_closedir, glob_copy.gl_closedir); 88657876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_readdir, glob_copy.gl_readdir); 88757876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_opendir, glob_copy.gl_opendir); 88857876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_lstat, glob_copy.gl_lstat); 88957876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov Swap(pglob->gl_stat, glob_copy.gl_stat); 89057876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov } 89157876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov pglob_copy = 0; 89257876cfc5357e2a04d17c56ee51e69c593a536beEvgeniy Stepanov glob_ctx = 0; 893906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob); 894a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov return res; 895a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov} 896906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov#define INIT_GLOB \ 897906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov INTERCEPT_FUNCTION(glob); \ 898a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov INTERCEPT_FUNCTION(glob64); 899906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov#else // SANITIZER_INTERCEPT_GLOB 900a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov#define INIT_GLOB 901906f2c11e854539f316f737b1f661c0f6bc66fabEvgeniy Stepanov#endif // SANITIZER_INTERCEPT_GLOB 902a1c2a5547d815a4ce116f04ebd3cef1716ab791cEvgeniy Stepanov 903897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#if SANITIZER_INTERCEPT_WAIT 9046a659dfd8e717a598f54867aa36c2e4af09d031bAlexander Potapenko// According to sys/wait.h, wait(), waitid(), waitpid() may have symbol version 9056a659dfd8e717a598f54867aa36c2e4af09d031bAlexander Potapenko// suffixes on Darwin. See the declaration of INTERCEPTOR_WITH_SUFFIX for 9066a659dfd8e717a598f54867aa36c2e4af09d031bAlexander Potapenko// details. 9076a659dfd8e717a598f54867aa36c2e4af09d031bAlexander PotapenkoINTERCEPTOR_WITH_SUFFIX(int, wait, int *status) { 908897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 909897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wait, status); 910897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(wait)(status); 911f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (res != -1 && status) 912897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 913897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 914897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 91530e970f769ccf11e61e472c6f8b22f8e866c592fKostya SerebryanyINTERCEPTOR_WITH_SUFFIX(int, waitid, int idtype, int id, void *infop, 91630e970f769ccf11e61e472c6f8b22f8e866c592fKostya Serebryany int options) { 917897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 918897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, waitid, idtype, id, infop, options); 919897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(waitid)(idtype, id, infop, options); 920f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (res != -1 && infop) 921897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, infop, siginfo_t_sz); 922897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 923897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 9246a659dfd8e717a598f54867aa36c2e4af09d031bAlexander PotapenkoINTERCEPTOR_WITH_SUFFIX(int, waitpid, int pid, int *status, int options) { 925897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 926897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, waitpid, pid, status, options); 927897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(waitpid)(pid, status, options); 928f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (res != -1 && status) 929897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 930897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 931897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 932897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy StepanovINTERCEPTOR(int, wait3, int *status, int options, void *rusage) { 933897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 934897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wait3, status, options, rusage); 935897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(wait3)(status, options, rusage); 936897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (res != -1) { 937f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (status) 938f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 939897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (rusage) 940897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, rusage, struct_rusage_sz); 941897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov } 942897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 943897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 944897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy StepanovINTERCEPTOR(int, wait4, int pid, int *status, int options, void *rusage) { 945897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov void *ctx; 946897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wait4, pid, status, options, rusage); 947897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov int res = REAL(wait4)(pid, status, options, rusage); 948897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (res != -1) { 949f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov if (status) 950f82eb24b61f8c0f23396ed5ba68f5ace7656e986Dmitry Vyukov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status)); 951897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov if (rusage) 952897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, rusage, struct_rusage_sz); 953897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov } 954897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov return res; 955897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov} 956897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#define INIT_WAIT \ 957897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(wait); \ 958897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(waitid); \ 959897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(waitpid); \ 960897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(wait3); \ 961897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov INTERCEPT_FUNCTION(wait4); 962897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#else 963897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#define INIT_WAIT 964897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov#endif 965897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov 9669530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#if SANITIZER_INTERCEPT_INET 9679530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovINTERCEPTOR(char *, inet_ntop, int af, const void *src, char *dst, u32 size) { 9689530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov void *ctx; 9699530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, inet_ntop, af, src, dst, size); 9709530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov uptr sz = __sanitizer_in_addr_sz(af); 9719530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (sz) COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sz); 9729530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov // FIXME: figure out read size based on the address family. 9739530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov char *res = REAL(inet_ntop)(af, src, dst, size); 9749530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (res) 9759530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 9769530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov return res; 9779530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov} 9789530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovINTERCEPTOR(int, inet_pton, int af, const char *src, void *dst) { 9799530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov void *ctx; 9809530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, inet_pton, af, src, dst); 9819530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov // FIXME: figure out read size based on the address family. 9829530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov int res = REAL(inet_pton)(af, src, dst); 9839530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (res == 1) { 9849530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov uptr sz = __sanitizer_in_addr_sz(af); 9859530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov if (sz) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, sz); 9869530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov } 9879530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov return res; 9889530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov} 9899530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#define INIT_INET \ 9909530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov INTERCEPT_FUNCTION(inet_ntop); \ 9919530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov INTERCEPT_FUNCTION(inet_pton); 9929530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#else 9939530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#define INIT_INET 9949530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#endif 9959530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov 9969d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#if SANITIZER_INTERCEPT_INET 9979d60087654f89e3452841350d9eca97644edca9dEvgeniy StepanovINTERCEPTOR(int, inet_aton, const char *cp, void *dst) { 9989d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov void *ctx; 9999d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, inet_aton, cp, dst); 10009d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov if (cp) COMMON_INTERCEPTOR_READ_RANGE(ctx, cp, REAL(strlen)(cp) + 1); 10019d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov int res = REAL(inet_aton)(cp, dst); 10029d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov if (res != 0) { 10039d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov uptr sz = __sanitizer_in_addr_sz(af_inet); 10049d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov if (sz) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, sz); 10059d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov } 10069d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov return res; 10079d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov} 10089d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#define INIT_INET_ATON INTERCEPT_FUNCTION(inet_aton); 10099d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#else 10109d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#define INIT_INET_ATON 10119d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov#endif 10129d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov 101356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#if SANITIZER_INTERCEPT_PTHREAD_GETSCHEDPARAM 101456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy StepanovINTERCEPTOR(int, pthread_getschedparam, uptr thread, int *policy, int *param) { 101556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov void *ctx; 101656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, pthread_getschedparam, thread, policy, param); 101756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov int res = REAL(pthread_getschedparam)(thread, policy, param); 101856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov if (res == 0) { 101956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov if (policy) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, policy, sizeof(*policy)); 102056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov if (param) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, param, sizeof(*param)); 102156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov } 102256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov return res; 102356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov} 102456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#define INIT_PTHREAD_GETSCHEDPARAM INTERCEPT_FUNCTION(pthread_getschedparam); 102556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#else 102656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#define INIT_PTHREAD_GETSCHEDPARAM 102756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#endif 1028897a4ae31f5c55255c78854b69b4cd4a4e3c7c39Evgeniy Stepanov 1029447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETADDRINFO 1030447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy StepanovINTERCEPTOR(int, getaddrinfo, char *node, char *service, 1031447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov struct __sanitizer_addrinfo *hints, 1032447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov struct __sanitizer_addrinfo **out) { 1033447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov void *ctx; 1034447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getaddrinfo, node, service, hints, out); 1035447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (node) COMMON_INTERCEPTOR_READ_RANGE(ctx, node, REAL(strlen)(node) + 1); 1036447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (service) 1037447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, service, REAL(strlen)(service) + 1); 1038447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (hints) 1039447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, hints, sizeof(__sanitizer_addrinfo)); 1040447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov int res = REAL(getaddrinfo)(node, service, hints, out); 10413538eb8a245ea4d17824d8a53feb8cecd3358762Evgeniy Stepanov if (res == 0 && out) { 10423538eb8a245ea4d17824d8a53feb8cecd3358762Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, out, sizeof(*out)); 1043447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov struct __sanitizer_addrinfo *p = *out; 1044447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov while (p) { 10453538eb8a245ea4d17824d8a53feb8cecd3358762Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, sizeof(*p)); 1046447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (p->ai_addr) 1047512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->ai_addr, p->ai_addrlen); 1048447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov if (p->ai_canonname) 1049447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->ai_canonname, 1050447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov REAL(strlen)(p->ai_canonname) + 1); 1051447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov p = p->ai_next; 1052447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov } 1053447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov } 1054447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov return res; 1055447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov} 1056447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#define INIT_GETADDRINFO INTERCEPT_FUNCTION(getaddrinfo); 1057447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#else 1058447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#define INIT_GETADDRINFO 1059447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#endif 1060447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 10619eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETNAMEINFO 10629eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy StepanovINTERCEPTOR(int, getnameinfo, void *sockaddr, unsigned salen, char *host, 10639eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov unsigned hostlen, char *serv, unsigned servlen, int flags) { 10649eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov void *ctx; 10659eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getnameinfo, sockaddr, salen, host, hostlen, 10669eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov serv, servlen, flags); 10679eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov // FIXME: consider adding READ_RANGE(sockaddr, salen) 10689eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov // There is padding in in_addr that may make this too noisy 10699eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov int res = 10709eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov REAL(getnameinfo)(sockaddr, salen, host, hostlen, serv, servlen, flags); 10719eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov if (res == 0) { 10729eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov if (host && hostlen) 10739eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, host, REAL(strlen)(host) + 1); 10749eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov if (serv && servlen) 10759eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, serv, REAL(strlen)(serv) + 1); 10769eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov } 10779eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov return res; 10789eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov} 10799eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#define INIT_GETNAMEINFO INTERCEPT_FUNCTION(getnameinfo); 10809eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#else 10819eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#define INIT_GETNAMEINFO 10829eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov#endif 10839eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov 10849f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETSOCKNAME 10859f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy StepanovINTERCEPTOR(int, getsockname, int sock_fd, void *addr, int *addrlen) { 10869f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov void *ctx; 10879f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getsockname, sock_fd, addr, addrlen); 10889f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addrlen, sizeof(*addrlen)); 10899f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov int addrlen_in = *addrlen; 10909f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov int res = REAL(getsockname)(sock_fd, addr, addrlen); 10919f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov if (res == 0) { 10929f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(addrlen_in, *addrlen)); 10939f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov } 10949f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov return res; 10959f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov} 10969f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#define INIT_GETSOCKNAME INTERCEPT_FUNCTION(getsockname); 10979f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#else 10989f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#define INIT_GETSOCKNAME 10999f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov#endif 1100447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov 110133b1485c3f1ea5a8089473ab1bb962d7bfb41d72Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETHOSTBYNAME || SANITIZER_INTERCEPT_GETHOSTBYNAME_R 11020a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanovstatic void write_hostent(void *ctx, struct __sanitizer_hostent *h) { 11030a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h, sizeof(__sanitizer_hostent)); 11040a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h->h_name) 11050a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h->h_name, REAL(strlen)(h->h_name) + 1); 11060a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char **p = h->h_aliases; 11070a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov while (*p) { 11080a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *p, REAL(strlen)(*p) + 1); 11090a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ++p; 11100a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11110a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE( 11120a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ctx, h->h_aliases, (p - h->h_aliases + 1) * sizeof(*h->h_aliases)); 11130a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov p = h->h_addr_list; 11140a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov while (*p) { 11150a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *p, h->h_length); 11160a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ++p; 11170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE( 11190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ctx, h->h_addr_list, (p - h->h_addr_list + 1) * sizeof(*h->h_addr_list)); 11200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 112133b1485c3f1ea5a8089473ab1bb962d7bfb41d72Evgeniy Stepanov#endif 11220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETHOSTBYNAME 11240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(struct __sanitizer_hostent *, gethostbyname, char *name) { 11250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname, name); 11270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *res = REAL(gethostbyname)(name); 11280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(struct __sanitizer_hostent *, gethostbyaddr, void *addr, int len, 11330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int type) { 11340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyaddr, addr, len, type); 11360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addr, len); 11370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *res = REAL(gethostbyaddr)(addr, len, type); 11380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11421d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry VyukovINTERCEPTOR(struct __sanitizer_hostent *, gethostent, int fake) { 11430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11441d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, gethostent, fake); 11451d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov struct __sanitizer_hostent *res = REAL(gethostent)(fake); 11460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(struct __sanitizer_hostent *, gethostbyname2, char *name, int af) { 11510a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname2, name, af); 11530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *res = REAL(gethostbyname2)(name, af); 11540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res) write_hostent(ctx, res); 11550a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11560a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11570a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME \ 11580a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostent); \ 11590a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyaddr); \ 11600a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname); \ 11610a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname2); 11620a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#else 11630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME 11640a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#endif 11650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETHOSTBYNAME_R 11670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostent_r, struct __sanitizer_hostent *ret, char *buf, 11680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov SIZE_T buflen, __sanitizer_hostent **result, int *h_errnop) { 11690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostent_r, ret, buf, buflen, result, 11710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov h_errnop); 11720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = REAL(gethostent_r)(ret, buf, buflen, result, h_errnop); 11730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 11740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 11750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 11760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 11770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 11790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 11800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 11820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostbyaddr_r, void *addr, int len, int type, 11850a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *ret, char *buf, SIZE_T buflen, 11860a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov __sanitizer_hostent **result, int *h_errnop) { 11870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 11880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyaddr_r, addr, len, type, ret, buf, 11890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov buflen, result, h_errnop); 11900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addr, len); 11910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = REAL(gethostbyaddr_r)(addr, len, type, ret, buf, buflen, result, 11920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov h_errnop); 11930a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 11940a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 11950a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 11960a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 11970a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 11980a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 11990a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 12000a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12010a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 12020a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 12030a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 12040a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostbyname_r, char *name, struct __sanitizer_hostent *ret, 12050a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char *buf, SIZE_T buflen, __sanitizer_hostent **result, 12060a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int *h_errnop) { 12070a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 12080a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname_r, name, ret, buf, buflen, result, 12090a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov h_errnop); 12100a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = REAL(gethostbyname_r)(name, ret, buf, buflen, result, h_errnop); 12110a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 12120a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 12130a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 12140a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 12150a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12160a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 12170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 12180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 12200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 12210a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 12220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovINTERCEPTOR(int, gethostbyname2_r, char *name, int af, 12230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct __sanitizer_hostent *ret, char *buf, SIZE_T buflen, 12240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov __sanitizer_hostent **result, int *h_errnop) { 12250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov void *ctx; 12260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, gethostbyname2_r, name, af, ret, buf, buflen, 12270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov result, h_errnop); 12280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = 12290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov REAL(gethostbyname2_r)(name, af, ret, buf, buflen, result, h_errnop); 12300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (res == 0) { 12310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (result) { 12320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 12330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (*result) write_hostent(ctx, *result); 12340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov if (h_errnop) 12360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, h_errnop, sizeof(*h_errnop)); 12370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } 12380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov return res; 12390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 12400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME_R \ 12410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostent_r); \ 12420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyaddr_r); \ 12430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname_r); \ 12440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INTERCEPT_FUNCTION(gethostbyname2_r); 12450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#else 12460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define INIT_GETHOSTBYNAME_R 12470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#endif 12480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 1249f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETSOCKOPT 1250f32be42523a199674ea665a499db131591e64e08Evgeniy StepanovINTERCEPTOR(int, getsockopt, int sockfd, int level, int optname, void *optval, 1251f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov int *optlen) { 1252f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov void *ctx; 1253f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getsockopt, sockfd, level, optname, optval, 1254f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov optlen); 1255f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov if (optlen) COMMON_INTERCEPTOR_READ_RANGE(ctx, optlen, sizeof(*optlen)); 1256f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov int res = REAL(getsockopt)(sockfd, level, optname, optval, optlen); 1257f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov if (res == 0) 1258f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov if (optval && optlen) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, optval, *optlen); 1259f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov return res; 1260f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov} 1261f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#define INIT_GETSOCKOPT INTERCEPT_FUNCTION(getsockopt); 1262f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#else 1263f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#define INIT_GETSOCKOPT 1264f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov#endif 1265f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov 12669d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#if SANITIZER_INTERCEPT_ACCEPT 12679d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovINTERCEPTOR(int, accept, int fd, void *addr, unsigned *addrlen) { 12689d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov void *ctx; 12699d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, accept, fd, addr, addrlen); 12709d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov unsigned addrlen0; 12719d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addrlen) { 12729d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addrlen, sizeof(*addrlen)); 12739d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov addrlen0 = *addrlen; 12749d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 12759d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int fd2 = REAL(accept)(fd, addr, addrlen); 12769d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd2 >= 0) { 12779d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd >= 0) 12789d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, fd2); 12799d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addr && addrlen) 12809d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(*addrlen, addrlen0)); 12819d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 12829d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov return fd2; 12839d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov} 12849d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT INTERCEPT_FUNCTION(accept); 12859d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#else 12869d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT 12879d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#endif 12889d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 12899d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#if SANITIZER_INTERCEPT_ACCEPT4 12909d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovINTERCEPTOR(int, accept4, int fd, void *addr, unsigned *addrlen, int f) { 12919d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov void *ctx; 12929d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, accept4, fd, addr, addrlen, f); 12939d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov unsigned addrlen0; 12949d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addrlen) { 12959d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, addrlen, sizeof(*addrlen)); 12969d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov addrlen0 = *addrlen; 12979d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 12989d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int fd2 = REAL(accept4)(fd, addr, addrlen, f); 12999d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd2 >= 0) { 13009d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (fd >= 0) 13019d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, fd2); 13029d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov if (addr && addrlen) 13039d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(*addrlen, addrlen0)); 13049d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov } 13059d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov return fd2; 13069d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov} 13079d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT4 INTERCEPT_FUNCTION(accept4); 13089d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#else 13099d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#define INIT_ACCEPT4 13109d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov#endif 13119d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 1312c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#if SANITIZER_INTERCEPT_MODF 1313c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovINTERCEPTOR(double, modf, double x, double *iptr) { 1314c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov void *ctx; 1315c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, modf, x, iptr); 1316c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov double res = REAL(modf)(x, iptr); 1317c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov if (iptr) { 1318c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iptr, sizeof(*iptr)); 1319c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov } 1320c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov return res; 1321c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1322c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovINTERCEPTOR(float, modff, float x, float *iptr) { 1323c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov void *ctx; 1324c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, modff, x, iptr); 1325c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov float res = REAL(modff)(x, iptr); 1326c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov if (iptr) { 1327c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iptr, sizeof(*iptr)); 1328c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov } 1329c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov return res; 1330c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1331c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovINTERCEPTOR(long double, modfl, long double x, long double *iptr) { 1332c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov void *ctx; 1333c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, modfl, x, iptr); 1334c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov long double res = REAL(modfl)(x, iptr); 1335c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov if (iptr) { 1336c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iptr, sizeof(*iptr)); 1337c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov } 1338c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov return res; 1339c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1340c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#define INIT_MODF \ 1341c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INTERCEPT_FUNCTION(modf); \ 1342c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INTERCEPT_FUNCTION(modff); \ 1343c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INTERCEPT_FUNCTION(modfl); 1344c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#else 1345c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#define INIT_MODF 1346c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov#endif 1347c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov 13489666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#if SANITIZER_INTERCEPT_RECVMSG 1349eb7c24bb2e6fd20410d34006759caf76852d0600Evgeniy Stepanovstatic void write_msghdr(void *ctx, struct __sanitizer_msghdr *msg, 1350eb7c24bb2e6fd20410d34006759caf76852d0600Evgeniy Stepanov SSIZE_T maxlen) { 13519666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg, sizeof(*msg)); 13529666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (msg->msg_name) 13539666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_name, 13549666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov REAL(strlen)((char *)msg->msg_name) + 1); 13559666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (msg->msg_iov) 1356b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_iov, 1357b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov sizeof(*msg->msg_iov) * msg->msg_iovlen); 1358b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov write_iovec(ctx, msg->msg_iov, msg->msg_iovlen, maxlen); 13599666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (msg->msg_control) 13609666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_control, msg->msg_controllen); 13619666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov} 13629666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov 13639666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy StepanovINTERCEPTOR(SSIZE_T, recvmsg, int fd, struct __sanitizer_msghdr *msg, 13649666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov int flags) { 13659666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov void *ctx; 13669666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, recvmsg, fd, msg, flags); 13679666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov SSIZE_T res = REAL(recvmsg)(fd, msg, flags); 13689666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (res >= 0) { 13699666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov if (fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); 1370b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov if (msg) write_msghdr(ctx, msg, res); 13719666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov } 13729666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov return res; 13739666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov} 13749666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#define INIT_RECVMSG INTERCEPT_FUNCTION(recvmsg); 13759666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#else 13769666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#define INIT_RECVMSG 13779666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov#endif 13789666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov 1379bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETPEERNAME 1380bc33e138d82759074f8333239f96506027731e20Evgeniy StepanovINTERCEPTOR(int, getpeername, int sockfd, void *addr, unsigned *addrlen) { 1381bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov void *ctx; 1382bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getpeername, sockfd, addr, addrlen); 1383bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov unsigned addr_sz; 1384bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov if (addrlen) addr_sz = *addrlen; 1385bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov int res = REAL(getpeername)(sockfd, addr, addrlen); 1386bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov if (!res && addr && addrlen) 1387bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, addr, Min(addr_sz, *addrlen)); 1388bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov return res; 1389bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov} 1390bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#define INIT_GETPEERNAME INTERCEPT_FUNCTION(getpeername); 1391bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#else 1392bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#define INIT_GETPEERNAME 1393bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov#endif 1394bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov 1395359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#if SANITIZER_INTERCEPT_SYSINFO 1396359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy StepanovINTERCEPTOR(int, sysinfo, void *info) { 1397359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov void *ctx; 1398359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sysinfo, info); 1399359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov int res = REAL(sysinfo)(info); 1400359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov if (!res && info) 1401359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, info, struct_sysinfo_sz); 1402359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov return res; 1403359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov} 1404359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#define INIT_SYSINFO INTERCEPT_FUNCTION(sysinfo); 1405359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#else 1406359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#define INIT_SYSINFO 1407359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#endif 1408359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov 1409b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#if SANITIZER_INTERCEPT_READDIR 1410a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy StepanovINTERCEPTOR(__sanitizer_dirent *, readdir, void *dirp) { 1411b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1412b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir, dirp); 1413a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov __sanitizer_dirent *res = REAL(readdir)(dirp); 1414b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (res) 1415a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, res->d_reclen); 1416b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1417b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1418b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 141952d08d8412bfa4ccfa38384d781b51e8774807a7Alexey SamsonovINTERCEPTOR(int, readdir_r, void *dirp, __sanitizer_dirent *entry, 142052d08d8412bfa4ccfa38384d781b51e8774807a7Alexey Samsonov __sanitizer_dirent **result) { 1421b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1422b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir_r, dirp, entry, result); 1423b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov int res = REAL(readdir_r)(dirp, entry, result); 1424b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (!res) { 14255a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 14265a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth if (*result) 14275a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *result, (*result)->d_reclen); 1428b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov } 1429b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1430b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1431b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1432b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR \ 1433b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir); \ 1434b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir_r); 1435b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#else 1436b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR 1437b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#endif 1438b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1439b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#if SANITIZER_INTERCEPT_READDIR64 1440a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy StepanovINTERCEPTOR(__sanitizer_dirent64 *, readdir64, void *dirp) { 1441b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1442b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir64, dirp); 1443a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov __sanitizer_dirent64 *res = REAL(readdir64)(dirp); 1444b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (res) 1445a0379b5566f7c04536a313e40c450c6aef4b3ec5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, res->d_reclen); 1446b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1447b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1448b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 144952d08d8412bfa4ccfa38384d781b51e8774807a7Alexey SamsonovINTERCEPTOR(int, readdir64_r, void *dirp, __sanitizer_dirent64 *entry, 145052d08d8412bfa4ccfa38384d781b51e8774807a7Alexey Samsonov __sanitizer_dirent64 **result) { 1451b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov void *ctx; 1452b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, readdir64_r, dirp, entry, result); 1453b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov int res = REAL(readdir64_r)(dirp, entry, result); 1454b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov if (!res) { 14555a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); 14565a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth if (*result) 14575a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *result, (*result)->d_reclen); 1458b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov } 1459b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov return res; 1460b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1461b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR64 \ 1462b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir64); \ 1463b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INTERCEPT_FUNCTION(readdir64_r); 1464b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#else 1465b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#define INIT_READDIR64 1466b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov#endif 1467b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1468341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if SANITIZER_INTERCEPT_PTRACE 1469341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy StepanovINTERCEPTOR(uptr, ptrace, int request, int pid, void *addr, void *data) { 1470341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov void *ctx; 1471341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ptrace, request, pid, addr, data); 1472341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1473341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (data) { 1474341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (request == ptrace_setregs) 1475341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_regs_struct_sz); 1476341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setfpregs) 1477341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_fpregs_struct_sz); 1478341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setfpxregs) 1479341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_fpxregs_struct_sz); 1480341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setsiginfo) 1481341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, data, siginfo_t_sz); 1482341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_setregset) { 1483341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov __sanitizer_iovec *iov = (__sanitizer_iovec *)data; 1484341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, iov->iov_base, iov->iov_len); 1485341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1486341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1487341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1488341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov uptr res = REAL(ptrace)(request, pid, addr, data); 1489341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1490341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (!res && data) { 1491341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // Note that PEEK* requests assing different meaning to the return value. 1492341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // This function does not handle them (nor does it need to). 1493341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (request == ptrace_getregs) 1494341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_regs_struct_sz); 1495341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getfpregs) 1496341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_fpregs_struct_sz); 1497341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getfpxregs) 1498341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_fpxregs_struct_sz); 1499341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getsiginfo) 1500341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, siginfo_t_sz); 1501341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov else if (request == ptrace_getregset) { 1502341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov __sanitizer_iovec *iov = (__sanitizer_iovec *)data; 1503341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iov->iov_base, iov->iov_len); 1504341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1505341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 1506341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov return res; 1507341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov} 1508341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 1509341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#define INIT_PTRACE \ 1510341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov INTERCEPT_FUNCTION(ptrace); 1511341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else 1512341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#define INIT_PTRACE 1513341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 1514341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 15153cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#if SANITIZER_INTERCEPT_SETLOCALE 15163cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy StepanovINTERCEPTOR(char *, setlocale, int category, char *locale) { 15173cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov void *ctx; 15183cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, setlocale, category, locale); 15193cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov if (locale) 15203cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, locale, REAL(strlen)(locale) + 1); 1521801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov char *res = REAL(setlocale)(category, locale); 15223cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov if (res) 15233cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 15243cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov return res; 15253cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov} 15263cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov 15273cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#define INIT_SETLOCALE \ 15283cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov INTERCEPT_FUNCTION(setlocale); 15293cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#else 15303cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#define INIT_SETLOCALE 15313cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov#endif 15323cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov 1533801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#if SANITIZER_INTERCEPT_GETCWD 1534801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovINTERCEPTOR(char *, getcwd, char *buf, SIZE_T size) { 1535801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov void *ctx; 1536801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getcwd, buf, size); 1537801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov char *res = REAL(getcwd)(buf, size); 1538801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov if (res) 1539801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 1540801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov return res; 1541801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 1542801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GETCWD \ 1543801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INTERCEPT_FUNCTION(getcwd); 1544801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#else 1545801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GETCWD 1546801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#endif 1547801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 1548801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#if SANITIZER_INTERCEPT_GET_CURRENT_DIR_NAME 15491d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry VyukovINTERCEPTOR(char *, get_current_dir_name, int fake) { 1550801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov void *ctx; 15511d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov COMMON_INTERCEPTOR_ENTER(ctx, get_current_dir_name, fake); 15521d02bea922d7b47686de5a5ca81a6bcc8905b6f8Dmitry Vyukov char *res = REAL(get_current_dir_name)(fake); 1553801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov if (res) 1554801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 1555801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov return res; 1556801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 1557801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 1558801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GET_CURRENT_DIR_NAME \ 1559801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INTERCEPT_FUNCTION(get_current_dir_name); 1560801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#else 1561801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#define INIT_GET_CURRENT_DIR_NAME 1562801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov#endif 1563b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 1564ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_STRTOIMAX 1565ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(INTMAX_T, strtoimax, const char *nptr, char **endptr, int base) { 1566ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1567ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strtoimax, nptr, endptr, base); 1568ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTMAX_T res = REAL(strtoimax)(nptr, endptr, base); 1569ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov if (endptr) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, endptr, sizeof(*endptr)); 1570ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1571ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1572ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1573ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(INTMAX_T, strtoumax, const char *nptr, char **endptr, int base) { 1574ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1575ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strtoumax, nptr, endptr, base); 1576ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTMAX_T res = REAL(strtoumax)(nptr, endptr, base); 1577ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov if (endptr) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, endptr, sizeof(*endptr)); 1578ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1579ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1580ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1581ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_STRTOIMAX \ 1582ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(strtoimax); \ 1583ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(strtoumax); 1584ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1585ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_STRTOIMAX 1586ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1587ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1588ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_MBSTOWCS 1589ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, mbstowcs, wchar_t *dest, const char *src, SIZE_T len) { 1590ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1591ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, mbstowcs, dest, src, len); 1592ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(mbstowcs)(dest, src, len); 1593098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest) { 1594e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov SIZE_T write_cnt = res + (res < len); 1595e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt * sizeof(wchar_t)); 1596e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1597ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1598ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1599ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1600ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, mbsrtowcs, wchar_t *dest, const char **src, SIZE_T len, 1601ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ps) { 1602ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1603ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, mbsrtowcs, dest, src, len, ps); 1604098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1605098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 16065a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth SIZE_T res = REAL(mbsrtowcs)(dest, src, len, ps); 1607098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T)(-1) && dest && src) { 1608098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov // This function, and several others, may or may not write the terminating 1609098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov // \0 character. They write it iff they clear *src. 1610098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1611e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt * sizeof(wchar_t)); 1612e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1613ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1614ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1615ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1616ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSTOWCS \ 1617ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(mbstowcs); \ 1618ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(mbsrtowcs); 1619ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1620ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSTOWCS 1621ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1622ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1623ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_MBSNRTOWCS 1624ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, mbsnrtowcs, wchar_t *dest, const char **src, SIZE_T nms, 1625ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T len, void *ps) { 1626ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1627ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, mbsnrtowcs, dest, src, nms, len, ps); 1628098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) { 1629ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1630098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (nms) COMMON_INTERCEPTOR_READ_RANGE(ctx, *src, nms); 1631ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov } 1632098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 1633ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(mbsnrtowcs)(dest, src, nms, len, ps); 1634098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T)(-1) && dest && src) { 1635098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1636e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt * sizeof(wchar_t)); 1637e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1638ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1639ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1640ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1641ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSNRTOWCS INTERCEPT_FUNCTION(mbsnrtowcs); 1642ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1643ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_MBSNRTOWCS 1644ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1645ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1646ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_WCSTOMBS 1647ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, wcstombs, char *dest, const wchar_t *src, SIZE_T len) { 1648ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1649ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wcstombs, dest, src, len); 1650ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(wcstombs)(dest, src, len); 1651098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest) { 1652e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov SIZE_T write_cnt = res + (res < len); 1653e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt); 1654e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1655ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1656ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1657ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1658ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, wcsrtombs, char *dest, const wchar_t **src, SIZE_T len, 1659ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ps) { 1660ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1661ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wcsrtombs, dest, src, len, ps); 1662098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1663098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 16645a482cd54a75bf821fb8c61f2fe4e84ae9efb714Chandler Carruth SIZE_T res = REAL(wcsrtombs)(dest, src, len, ps); 1665098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest && src) { 1666098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1667e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt); 1668e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1669ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1670ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1671ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1672ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSTOMBS \ 1673ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(wcstombs); \ 1674ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INTERCEPT_FUNCTION(wcsrtombs); 1675ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1676ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSTOMBS 1677ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1678ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1679ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#if SANITIZER_INTERCEPT_WCSNRTOMBS 1680ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovINTERCEPTOR(SIZE_T, wcsnrtombs, char *dest, const wchar_t **src, SIZE_T nms, 1681ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T len, void *ps) { 1682ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov void *ctx; 1683ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wcsnrtombs, dest, src, nms, len, ps); 1684098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (src) { 1685ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(*src)); 1686098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (nms) COMMON_INTERCEPTOR_READ_RANGE(ctx, *src, nms); 1687ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov } 1688098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (ps) COMMON_INTERCEPTOR_READ_RANGE(ctx, ps, mbstate_t_sz); 1689ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov SIZE_T res = REAL(wcsnrtombs)(dest, src, nms, len, ps); 1690098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov if (res != (SIZE_T) - 1 && dest && src) { 1691098c58fc48a934dd51df31e92efa236a5e1916e2Alexey Samsonov SIZE_T write_cnt = res + !*src; 1692e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, write_cnt); 1693e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov } 1694ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov return res; 1695ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1696ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1697ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSNRTOMBS INTERCEPT_FUNCTION(wcsnrtombs); 1698ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#else 1699ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#define INIT_WCSNRTOMBS 1700ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#endif 1701ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1702ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov 1703ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#if SANITIZER_INTERCEPT_TCGETATTR 1704ea72768894e32f367607c2142a7dfab603310da0Evgeniy StepanovINTERCEPTOR(int, tcgetattr, int fd, void *termios_p) { 1705ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov void *ctx; 1706ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, tcgetattr, fd, termios_p); 1707ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov int res = REAL(tcgetattr)(fd, termios_p); 1708ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov if (!res && termios_p) 1709ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, termios_p, struct_termios_sz); 1710ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov return res; 1711ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov} 1712ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov 1713ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#define INIT_TCGETATTR INTERCEPT_FUNCTION(tcgetattr); 1714ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#else 1715ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#define INIT_TCGETATTR 1716ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov#endif 1717ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov 171812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 171912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#if SANITIZER_INTERCEPT_REALPATH 172012eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovINTERCEPTOR(char *, realpath, const char *path, char *resolved_path) { 172112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov void *ctx; 172212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, realpath, path, resolved_path); 172312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1); 172412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 172512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // Workaround a bug in glibc where dlsym(RTLD_NEXT, ...) returns the oldest 172612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // version of a versioned symbol. For realpath(), this gives us something 172712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // (called __old_realpath) that does not handle NULL in the second argument. 172812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov // Handle it as part of the interceptor. 172912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char *allocated_path = 0; 173012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (!resolved_path) 173112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov allocated_path = resolved_path = (char *)WRAP(malloc)(path_max + 1); 173212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 173312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char *res = REAL(realpath)(path, resolved_path); 173412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (allocated_path && !res) 173512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov WRAP(free)(allocated_path); 173612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 173712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov return res; 173812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov} 173912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_REALPATH INTERCEPT_FUNCTION(realpath); 174012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#else 174112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_REALPATH 174212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#endif 174312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 174412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#if SANITIZER_INTERCEPT_CANONICALIZE_FILE_NAME 174512eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovINTERCEPTOR(char *, canonicalize_file_name, const char *path) { 174612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov void *ctx; 174712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, canonicalize_file_name, path); 174812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1); 174912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char *res = REAL(canonicalize_file_name)(path); 175012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov if (res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 175112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov return res; 175212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov} 175312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_CANONICALIZE_FILE_NAME INTERCEPT_FUNCTION(canonicalize_file_name); 175412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#else 175512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#define INIT_CANONICALIZE_FILE_NAME 175612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov#endif 175712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 17585ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#if SANITIZER_INTERCEPT_CONFSTR 17595ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy StepanovINTERCEPTOR(SIZE_T, confstr, int name, char *buf, SIZE_T len) { 17605ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov void *ctx; 17615ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, confstr, name, buf, len); 17625ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov SIZE_T res = REAL(confstr)(name, buf, len); 17635ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov if (buf && res) 17645ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, res < len ? res : len); 17655ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov return res; 17665ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov} 17675ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#define INIT_CONFSTR INTERCEPT_FUNCTION(confstr); 17685ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#else 17695ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#define INIT_CONFSTR 17705ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov#endif 17715ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov 177284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#if SANITIZER_INTERCEPT_SCHED_GETAFFINITY 177384ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy StepanovINTERCEPTOR(int, sched_getaffinity, int pid, SIZE_T cpusetsize, void *mask) { 177484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov void *ctx; 177584ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sched_getaffinity, pid, cpusetsize, mask); 177684ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov int res = REAL(sched_getaffinity)(pid, cpusetsize, mask); 177784ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov if (mask && !res) 177884ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, mask, cpusetsize); 177984ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov return res; 178084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov} 178184ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#define INIT_SCHED_GETAFFINITY INTERCEPT_FUNCTION(sched_getaffinity); 178284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#else 178384ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#define INIT_SCHED_GETAFFINITY 178484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov#endif 178584ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov 17861204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#if SANITIZER_INTERCEPT_STRERROR 17871204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovINTERCEPTOR(char *, strerror, int errnum) { 17881204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov void *ctx; 17891204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strerror, errnum); 17901204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov char *res = REAL(strerror)(errnum); 17911204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov if (res) 17921204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 17931204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov return res; 17941204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov} 17951204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR INTERCEPT_FUNCTION(strerror); 17961204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#else 17971204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR 17981204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#endif 17991204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov 18001204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#if SANITIZER_INTERCEPT_STRERROR_R 18011204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovINTERCEPTOR(char *, strerror_r, int errnum, char *buf, SIZE_T buflen) { 18021204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov void *ctx; 18031204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, strerror_r, errnum, buf, buflen); 18041204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov char *res = REAL(strerror_r)(errnum, buf, buflen); 18051204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // There are 2 versions of strerror_r: 18061204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // * POSIX version returns 0 on success, negative error code on failure, 18071204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // writes message to buf. 18081204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // * GNU version returns message pointer, which points to either buf or some 18091204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // static storage. 1810d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov SIZE_T posix_res = (SIZE_T)res; 1811d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov if (posix_res < 1024 || posix_res > (SIZE_T) - 1024) { 18121204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // POSIX version. Spec is not clear on whether buf is NULL-terminated. 1813d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov // At least on OSX, buf contents are valid even when the call fails. 18141204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov SIZE_T sz = internal_strnlen(buf, buflen); 18151204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov if (sz < buflen) ++sz; 18161204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, sz); 1817d9a5e243254764ab1024320ef34bc2a87180f4c5Evgeniy Stepanov } else { 18181204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov // GNU version. 18191204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 18201204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov } 18211204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov return res; 18221204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov} 18231204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR_R INTERCEPT_FUNCTION(strerror_r); 18241204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#else 18251204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#define INIT_STRERROR_R 18261204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov#endif 18271204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov 1828224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANDIR 1829224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir_filter_f)(const struct __sanitizer_dirent *); 1830224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir_compar_f)(const struct __sanitizer_dirent **, 1831224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent **); 1832224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1833224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL void *scandir_ctx; 1834224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir_filter_f scandir_filter; 1835224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir_compar_f scandir_compar; 1836224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1837224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir_filter(const struct __sanitizer_dirent *dir) { 1838224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir_ctx, 1); 1839224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, dir, dir->d_reclen); 1840224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir_filter(dir); 1841224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1842224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1843224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir_compar(const struct __sanitizer_dirent **a, 1844224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent **b) { 1845224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir_ctx, 2); 1846224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, a, sizeof(*a)); 1847224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, *a, (*a)->d_reclen); 1848224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, b, sizeof(*b)); 1849224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, *b, (*b)->d_reclen); 1850224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir_compar(a, b); 1851224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1852224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1853224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy StepanovINTERCEPTOR(int, scandir, char *dirp, __sanitizer_dirent ***namelist, 1854224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_filter_f filter, scandir_compar_f compar) { 1855224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov void *ctx; 1856224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, scandir, dirp, namelist, filter, compar); 1857224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (dirp) COMMON_INTERCEPTOR_READ_RANGE(ctx, dirp, REAL(strlen)(dirp) + 1); 18585bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov CHECK_EQ(0, scandir_ctx); 1859224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_ctx = ctx; 1860224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_filter = filter; 1861224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_compar = compar; 1862224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov int res = REAL(scandir)(dirp, namelist, filter ? wrapped_scandir_filter : 0, 1863224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov compar ? wrapped_scandir_compar : 0); 1864224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_ctx = 0; 1865224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_filter = 0; 1866224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir_compar = 0; 1867224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (namelist && res > 0) { 1868224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, namelist, sizeof(*namelist)); 1869224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *namelist, sizeof(**namelist) * res); 1870224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov for (int i = 0; i < res; ++i) 1871224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, (*namelist)[i], 1872224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov (*namelist)[i]->d_reclen); 1873224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov } 1874224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return res; 1875224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1876224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR INTERCEPT_FUNCTION(scandir); 1877224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#else 1878224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR 1879224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#endif 1880224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1881224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#if SANITIZER_INTERCEPT_SCANDIR64 1882224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir64_filter_f)(const struct __sanitizer_dirent64 *); 1883224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovtypedef int (*scandir64_compar_f)(const struct __sanitizer_dirent64 **, 1884224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent64 **); 1885224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1886224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL void *scandir64_ctx; 1887224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir64_filter_f scandir64_filter; 1888224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic THREADLOCAL scandir64_compar_f scandir64_compar; 1889224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1890224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir64_filter(const struct __sanitizer_dirent64 *dir) { 1891224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir64_ctx, 1); 1892224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, dir, dir->d_reclen); 1893224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir64_filter(dir); 1894224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1895224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1896224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanovstatic int wrapped_scandir64_compar(const struct __sanitizer_dirent64 **a, 1897224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov const struct __sanitizer_dirent64 **b) { 1898224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir64_ctx, 2); 1899224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, a, sizeof(*a)); 1900224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, *a, (*a)->d_reclen); 1901224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, b, sizeof(*b)); 1902224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, *b, (*b)->d_reclen); 1903224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return scandir64_compar(a, b); 1904224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1905224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1906224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy StepanovINTERCEPTOR(int, scandir64, char *dirp, __sanitizer_dirent64 ***namelist, 1907224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_filter_f filter, scandir64_compar_f compar) { 1908224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov void *ctx; 1909224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, scandir64, dirp, namelist, filter, compar); 1910224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (dirp) COMMON_INTERCEPTOR_READ_RANGE(ctx, dirp, REAL(strlen)(dirp) + 1); 19115bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov CHECK_EQ(0, scandir64_ctx); 1912224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_ctx = ctx; 1913224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_filter = filter; 1914224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_compar = compar; 1915224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov int res = 1916224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov REAL(scandir64)(dirp, namelist, filter ? wrapped_scandir64_filter : 0, 1917224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov compar ? wrapped_scandir64_compar : 0); 1918224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_ctx = 0; 1919224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_filter = 0; 1920224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov scandir64_compar = 0; 1921224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov if (namelist && res > 0) { 1922224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, namelist, sizeof(*namelist)); 1923224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *namelist, sizeof(**namelist) * res); 1924224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov for (int i = 0; i < res; ++i) 1925224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, (*namelist)[i], 1926224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov (*namelist)[i]->d_reclen); 1927224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov } 1928224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov return res; 1929224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov} 1930224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR64 INTERCEPT_FUNCTION(scandir64); 1931224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#else 1932224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#define INIT_SCANDIR64 1933224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov#endif 1934224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov 1935edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#if SANITIZER_INTERCEPT_GETGROUPS 1936edff34b5175c6759685da82077c99ee2be017667Evgeniy StepanovINTERCEPTOR(int, getgroups, int size, u32 *lst) { 1937edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov void *ctx; 1938edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, getgroups, size, lst); 1939edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov int res = REAL(getgroups)(size, lst); 1940edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov if (res && lst) 1941edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lst, res * sizeof(*lst)); 1942edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov return res; 1943edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov} 1944edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#define INIT_GETGROUPS INTERCEPT_FUNCTION(getgroups); 1945edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#else 1946edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#define INIT_GETGROUPS 1947edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov#endif 1948edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov 1949e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#if SANITIZER_INTERCEPT_POLL 1950e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanovstatic void read_pollfd(void *ctx, __sanitizer_pollfd *fds, 1951e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov __sanitizer_nfds_t nfds) { 1952e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov for (unsigned i = 0; i < nfds; ++i) { 1953e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, &fds[i].fd, sizeof(fds[i].fd)); 1954e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, &fds[i].events, sizeof(fds[i].events)); 1955e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov } 1956e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1957e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1958e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanovstatic void write_pollfd(void *ctx, __sanitizer_pollfd *fds, 1959e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov __sanitizer_nfds_t nfds) { 1960e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov for (unsigned i = 0; i < nfds; ++i) 19615bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, &fds[i].revents, 19625bd2174c1385ec10b172cc9a32bc33b1967d60b5Alexey Samsonov sizeof(fds[i].revents)); 1963e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1964e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1965e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovINTERCEPTOR(int, poll, __sanitizer_pollfd *fds, __sanitizer_nfds_t nfds, 1966e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int timeout) { 1967e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov void *ctx; 1968e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, poll, fds, nfds, timeout); 1969e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) read_pollfd(ctx, fds, nfds); 1970e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int res = COMMON_INTERCEPTOR_BLOCK_REAL(poll)(fds, nfds, timeout); 1971e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) write_pollfd(ctx, fds, nfds); 1972e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov return res; 1973e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1974e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_POLL INTERCEPT_FUNCTION(poll); 1975e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#else 1976e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_POLL 1977e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#endif 1978e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1979e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#if SANITIZER_INTERCEPT_PPOLL 1980e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovINTERCEPTOR(int, ppoll, __sanitizer_pollfd *fds, __sanitizer_nfds_t nfds, 1981b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov void *timeout_ts, __sanitizer_sigset_t *sigmask) { 1982e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov void *ctx; 1983e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, ppoll, fds, nfds, timeout_ts, sigmask); 1984e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) read_pollfd(ctx, fds, nfds); 1985e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (timeout_ts) 1986e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, timeout_ts, struct_timespec_sz); 1987b32d1bfc59592bc57d74a1e940881354b4788eaeEvgeniy Stepanov // FIXME: read sigmask when all of sigemptyset, etc are intercepted. 1988e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int res = 1989e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov COMMON_INTERCEPTOR_BLOCK_REAL(ppoll)(fds, nfds, timeout_ts, sigmask); 1990e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov if (fds && nfds) write_pollfd(ctx, fds, nfds); 1991e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov return res; 1992e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 1993e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_PPOLL INTERCEPT_FUNCTION(ppoll); 1994e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#else 1995e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#define INIT_PPOLL 1996e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#endif 1997e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 1998c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#if SANITIZER_INTERCEPT_WORDEXP 1999c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy StepanovINTERCEPTOR(int, wordexp, char *s, __sanitizer_wordexp_t *p, int flags) { 2000c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov void *ctx; 2001c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, wordexp, s, p, flags); 2002c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (s) COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1); 2003c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov int res = REAL(wordexp)(s, p, flags); 2004c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (!res && p) { 2005c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, sizeof(*p)); 2006c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (p->we_wordc) 2007c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->we_wordv, 2008c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov sizeof(*p->we_wordv) * p->we_wordc); 2009c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov for (uptr i = 0; i < p->we_wordc; ++i) { 2010c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov char *w = p->we_wordv[i]; 2011c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov if (w) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, w, REAL(strlen)(w) + 1); 2012c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov } 2013c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov } 2014c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov return res; 2015c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov} 2016c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#define INIT_WORDEXP INTERCEPT_FUNCTION(wordexp); 2017c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#else 2018c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#define INIT_WORDEXP 2019c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#endif 2020c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov 20219a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGWAIT 20229a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigwait, __sanitizer_sigset_t *set, int *sig) { 20239a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20249a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigwait, set, sig); 20259a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 20269a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigwait)(set, sig); 20279a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && sig) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, sig, sizeof(*sig)); 20289a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20299a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20309a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAIT INTERCEPT_FUNCTION(sigwait); 20319a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20329a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAIT 20339a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20349a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20359a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGWAITINFO 20369a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigwaitinfo, __sanitizer_sigset_t *set, void *info) { 20379a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20389a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigwaitinfo, set, info); 20399a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 20409a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigwaitinfo)(set, info); 20419a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (res > 0 && info) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, info, siginfo_t_sz); 20429a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20439a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20449a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAITINFO INTERCEPT_FUNCTION(sigwaitinfo); 20459a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20469a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGWAITINFO 20479a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20489a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20499a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGTIMEDWAIT 20509a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigtimedwait, __sanitizer_sigset_t *set, void *info, 20519a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *timeout) { 20529a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20539a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigtimedwait, set, info, timeout); 20549a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (timeout) COMMON_INTERCEPTOR_READ_RANGE(ctx, timeout, struct_timespec_sz); 20559a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 20569a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigtimedwait)(set, info, timeout); 20579a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (res > 0 && info) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, info, siginfo_t_sz); 20589a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20599a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20609a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGTIMEDWAIT INTERCEPT_FUNCTION(sigtimedwait); 20619a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20629a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGTIMEDWAIT 20639a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20649a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20659a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGSETOPS 20669a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigemptyset, __sanitizer_sigset_t *set) { 20679a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20689a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigemptyset, set); 20699a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigemptyset)(set); 20709a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && set) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, set, sizeof(*set)); 20719a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20729a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20739a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20749a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigfillset, __sanitizer_sigset_t *set) { 20759a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20769a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigfillset, set); 20779a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigfillset)(set); 20789a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && set) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, set, sizeof(*set)); 20799a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20809a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20819a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGSETOPS \ 20829a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INTERCEPT_FUNCTION(sigemptyset); \ 20839a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INTERCEPT_FUNCTION(sigfillset); 20849a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20859a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGSETOPS 20869a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 20879a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 20889a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGPENDING 20899a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigpending, __sanitizer_sigset_t *set) { 20909a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 20919a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigpending, set); 20929a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigpending)(set); 20939a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && set) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, set, sizeof(*set)); 20949a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 20959a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 20969a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPENDING INTERCEPT_FUNCTION(sigpending); 20979a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 20989a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPENDING 20999a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 21009a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 21019a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#if SANITIZER_INTERCEPT_SIGPROCMASK 21029a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovINTERCEPTOR(int, sigprocmask, int how, __sanitizer_sigset_t *set, 21039a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov __sanitizer_sigset_t *oldset) { 21049a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov void *ctx; 21059a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, sigprocmask, how, set, oldset); 21069a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov // FIXME: read sigset_t when all of sigemptyset, etc are intercepted 21079a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = REAL(sigprocmask)(how, set, oldset); 21089a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov if (!res && oldset) 21099a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, oldset, sizeof(*oldset)); 21109a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov return res; 21119a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 21129a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPROCMASK INTERCEPT_FUNCTION(sigprocmask); 21139a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#else 21149a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#define INIT_SIGPROCMASK 21159a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov#endif 21169a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 21171394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#if SANITIZER_INTERCEPT_BACKTRACE 21181394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy StepanovINTERCEPTOR(int, backtrace, void **buffer, int size) { 21191394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov void *ctx; 21201394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, backtrace, buffer, size); 21211394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov int res = REAL(backtrace)(buffer, size); 21221394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov if (res && buffer) 21231394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buffer, res * sizeof(*buffer)); 21241394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov return res; 21251394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov} 21261394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov 21271394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy StepanovINTERCEPTOR(char **, backtrace_symbols, void **buffer, int size) { 21281394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov void *ctx; 21291394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_ENTER(ctx, backtrace_symbols, buffer, size); 21301394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov if (buffer && size) 21311394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_READ_RANGE(ctx, buffer, size * sizeof(*buffer)); 21321394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov char ** res = REAL(backtrace_symbols)(buffer, size); 21331394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov if (res && size) { 21341394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, size * sizeof(*res)); 21351394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov for (int i = 0; i < size; ++i) 21361394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res[i], REAL(strlen(res[i])) + 1); 21371394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov } 21381394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov return res; 21391394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov} 21401394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#define INIT_BACKTRACE \ 21411394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INTERCEPT_FUNCTION(backtrace); \ 21421394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INTERCEPT_FUNCTION(backtrace_symbols); 21431394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#else 21441394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#define INIT_BACKTRACE 21451394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov#endif 21461394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov 214756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov#define SANITIZER_COMMON_INTERCEPTORS_INIT \ 214867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov INIT_STRCMP; \ 214967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov INIT_STRNCMP; \ 215056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_STRCASECMP; \ 215156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_STRNCASECMP; \ 215256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_READ; \ 215356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PREAD; \ 215456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PREAD64; \ 2155b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_READV; \ 2156b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PREADV; \ 2157b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PREADV64; \ 215856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_WRITE; \ 215956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PWRITE; \ 216056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_PWRITE64; \ 2161b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_WRITEV; \ 2162b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PWRITEV; \ 2163b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PWRITEV64; \ 2164b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov INIT_PRCTL; \ 216556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_LOCALTIME_AND_FRIENDS; \ 216656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_SCANF; \ 2167ba15077bf83ebf9a32bfefcd0c9c2f35ab36001dEvgeniy Stepanov INIT_ISOC99_SCANF; \ 216856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_FREXP; \ 216956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_FREXPF_FREXPL; \ 217056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GETPWNAM_AND_FRIENDS; \ 217156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GETPWNAM_R_AND_FRIENDS; \ 217256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_CLOCK_GETTIME; \ 217356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GETITIMER; \ 217456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_TIME; \ 217556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_GLOB; \ 217656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_WAIT; \ 217756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov INIT_INET; \ 2178447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov INIT_PTHREAD_GETSCHEDPARAM; \ 21799f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov INIT_GETADDRINFO; \ 21809eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov INIT_GETNAMEINFO; \ 21810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INIT_GETSOCKNAME; \ 21820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov INIT_GETHOSTBYNAME; \ 2183f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov INIT_GETHOSTBYNAME_R; \ 21849d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov INIT_GETSOCKOPT; \ 21859d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov INIT_ACCEPT; \ 2186c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov INIT_ACCEPT4; \ 21879666d89b628867b2c790d5415f0371fdb4050b0cEvgeniy Stepanov INIT_MODF; \ 2188bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov INIT_RECVMSG; \ 2189745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov INIT_GETPEERNAME; \ 21909d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov INIT_IOCTL; \ 2191359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov INIT_INET_ATON; \ 2192b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INIT_SYSINFO; \ 2193b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov INIT_READDIR; \ 2194341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov INIT_READDIR64; \ 21953cae6040ebb4ce14123b8ba000b79b4383dbd48aEvgeniy Stepanov INIT_PTRACE; \ 2196801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INIT_SETLOCALE; \ 2197801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov INIT_GETCWD; \ 2198ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_GET_CURRENT_DIR_NAME; \ 2199ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_STRTOIMAX; \ 2200ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_MBSTOWCS; \ 2201ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_MBSNRTOWCS; \ 2202ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov INIT_WCSTOMBS; \ 2203ea72768894e32f367607c2142a7dfab603310da0Evgeniy Stepanov INIT_WCSNRTOMBS; \ 220412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov INIT_TCGETATTR; \ 220512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov INIT_REALPATH; \ 22065ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov INIT_CANONICALIZE_FILE_NAME; \ 220784ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov INIT_CONFSTR; \ 22081204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov INIT_SCHED_GETAFFINITY; \ 22091204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov INIT_STRERROR; \ 2210224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov INIT_STRERROR_R; \ 2211224226c18c1ee1f9d187de86bf1c5023cb153c71Evgeniy Stepanov INIT_SCANDIR; \ 2212edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov INIT_SCANDIR64; \ 2213e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov INIT_GETGROUPS; \ 2214e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov INIT_POLL; \ 2215c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov INIT_PPOLL; \ 22169a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_WORDEXP; \ 22179a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGWAIT; \ 22189a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGWAITINFO; \ 22199a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGTIMEDWAIT; \ 22209a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGSETOPS; \ 22219a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov INIT_SIGPENDING; \ 22221394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INIT_SIGPROCMASK; \ 22231394be15dfc8a8fc0586d5f5e4302c2c8e917148Evgeniy Stepanov INIT_BACKTRACE; 2224