sanitizer_common_interceptors.inc revision c20b321d49f0eff60f1394d56e623d8ca94f24d7
18530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany//===-- sanitizer_common_interceptors.h -------------------------*- 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//===----------------------------------------------------------------------===// 228530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany#ifndef SANITIZER_COMMON_INTERCEPTORS_H 238530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany#define SANITIZER_COMMON_INTERCEPTORS_H 248530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 256afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany#include "interception/interception.h" 2674737d595c4e3638b980bd88b0492247ae4318faAlexey Samsonov#include "sanitizer_platform_interceptors.h" 27b1cc4e448f35515e737ac4969aaa04f3fa3af10aKostya Serebryany 288ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#if SANITIZER_INTERCEPT_READ 296afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, read, int fd, void *ptr, SIZE_T count) { 308530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany COMMON_INTERCEPTOR_ENTER(read, fd, ptr, count); 316afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(read)(fd, ptr, count); 328530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany if (res > 0) 338530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany COMMON_INTERCEPTOR_WRITE_RANGE(ptr, res); 34c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany if (res >= 0 && fd >= 0) 35c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany COMMON_INTERCEPTOR_FD_ACQUIRE(fd); 368530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany return res; 378530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany} 38c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_READ INTERCEPT_FUNCTION(read) 39c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 40c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_READ 418ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov#endif 428530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 43c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#if SANITIZER_INTERCEPT_PREAD 446afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread, int fd, void *ptr, SIZE_T count, OFF_T offset) { 458530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany COMMON_INTERCEPTOR_ENTER(pread, fd, ptr, count, offset); 466afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(pread)(fd, ptr, count, offset); 478530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany if (res > 0) 488530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany COMMON_INTERCEPTOR_WRITE_RANGE(ptr, res); 49c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany if (res >= 0 && fd >= 0) 50c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany COMMON_INTERCEPTOR_FD_ACQUIRE(fd); 518530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany return res; 528530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany} 53c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PREAD INTERCEPT_FUNCTION(pread) 54c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 55c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PREAD 56c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov#endif 578530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 58b1cc4e448f35515e737ac4969aaa04f3fa3af10aKostya Serebryany#if SANITIZER_INTERCEPT_PREAD64 596afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya SerebryanyINTERCEPTOR(SSIZE_T, pread64, int fd, void *ptr, SIZE_T count, OFF64_T offset) { 608530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany COMMON_INTERCEPTOR_ENTER(pread64, fd, ptr, count, offset); 616afa1b0406f5cce7256d4f8717bfe394a16999b5Kostya Serebryany SSIZE_T res = REAL(pread64)(fd, ptr, count, offset); 628530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany if (res > 0) 638530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany COMMON_INTERCEPTOR_WRITE_RANGE(ptr, res); 64c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany if (res >= 0 && fd >= 0) 65c8033193376c3326478a345c4ae6633d4d2862c6Kostya Serebryany COMMON_INTERCEPTOR_FD_ACQUIRE(fd); 668530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany return res; 678530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany} 68c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PREAD64 INTERCEPT_FUNCTION(pread64) 69c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 70c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PREAD64 711f5e23e3204961456d4c7a9b45060597d4ff69afAlexander Potapenko#endif 728530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 73c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_WRITE 74c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(SSIZE_T, write, int fd, void *ptr, SIZE_T count) { 75c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_ENTER(write, fd, ptr, count); 76c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (fd >= 0) 77c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_FD_RELEASE(fd); 78c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SSIZE_T res = REAL(write)(fd, ptr, count); 79c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (res > 0) 80c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_READ_RANGE(ptr, res); 81c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 82c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 83c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_WRITE INTERCEPT_FUNCTION(write) 84153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else 85c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_WRITE 86153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif 87153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany 88c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE 89c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(SSIZE_T, pwrite, int fd, void *ptr, SIZE_T count) { 90c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_ENTER(pwrite, fd, ptr, count); 91c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (fd >= 0) 92c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_FD_RELEASE(fd); 93c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SSIZE_T res = REAL(pwrite)(fd, ptr, count); 94c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (res > 0) 95c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_READ_RANGE(ptr, res); 96c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 97c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 98c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PWRITE INTERCEPT_FUNCTION(pwrite) 99153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else 100c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PWRITE 101153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif 102153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany 103c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PWRITE64 104c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(SSIZE_T, pwrite64, int fd, void *ptr, OFF64_T count) { 105c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_ENTER(pwrite64, fd, ptr, count); 106c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (fd >= 0) 107c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_FD_RELEASE(fd); 108c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany SSIZE_T res = REAL(pwrite64)(fd, ptr, count); 109c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (res > 0) 110c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_READ_RANGE(ptr, res); 111c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 112c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 113c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PWRITE64 INTERCEPT_FUNCTION(pwrite64) 114153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#else 115c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PWRITE64 116153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany#endif 117153ba3f41d8f6ad1641ae76cfdf01445cec9db89Kostya Serebryany 118c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#if SANITIZER_INTERCEPT_PRCTL 119c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya SerebryanyINTERCEPTOR(int, prctl, int option, 120c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany unsigned long arg2, unsigned long arg3, // NOLINT 121c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany unsigned long arg4, unsigned long arg5) { // NOLINT 122c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_ENTER(prctl, option, arg2, arg3, arg4, arg5); 123c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany static const int PR_SET_NAME = 15; 124c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany int res = REAL(prctl(option, arg2, arg3, arg4, arg5)); 125c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany if (option == PR_SET_NAME) { 126c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany char buff[16]; 127c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany internal_strncpy(buff, (char*)arg2, 15); 128c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany buff[15] = 0; 129c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany COMMON_INTERCEPTOR_SET_THREAD_NAME(buff); 130c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany } 131c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany return res; 132c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany} 133c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PRCTL INTERCEPT_FUNCTION(prctl) 134c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#else 135c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany# define INIT_PRCTL 136c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany#endif // SANITIZER_INTERCEPT_PRCTL 137c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany 1388530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany#define SANITIZER_COMMON_INTERCEPTORS_INIT \ 1398ffd87791a5376d44edfa288cbf469702edbfa22Alexey Samsonov INIT_READ; \ 140c333dffb81f1d85483d657c254c17f636ab192c5Alexey Samsonov INIT_PREAD; \ 1411f5e23e3204961456d4c7a9b45060597d4ff69afAlexander Potapenko INIT_PREAD64; \ 142c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany INIT_PRCTL; \ 143c20b321d49f0eff60f1394d56e623d8ca94f24d7Kostya Serebryany INIT_WRITE; \ 1448530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany 1458530e2b953f0b34ecd267a6aba5f155d5c08c5c8Kostya Serebryany#endif // SANITIZER_COMMON_INTERCEPTORS_H 146