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