forked from OSchip/llvm-project
[sanitizer] Simplify interceptors with user callbacks.
Get rid of the context argument in UNPOISON_PARAM and INITIALIZE_RANGE. Get rid of all the thread-local contexts in interceptors. llvm-svn: 203119
This commit is contained in:
parent
95cd50f6d1
commit
72a9d25060
|
@ -110,9 +110,6 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
|
|||
#endif // SANITIZER_MAC
|
||||
|
||||
#define COMMON_INTERCEPT_FUNCTION(name) ASAN_INTERCEPT_FUNC(name)
|
||||
#define COMMON_INTERCEPTOR_UNPOISON_PARAM(ctx, count) \
|
||||
do { \
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \
|
||||
ASAN_WRITE_RANGE(ptr, size)
|
||||
#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) ASAN_READ_RANGE(ptr, size)
|
||||
|
|
|
@ -1199,13 +1199,13 @@ int OnExit() {
|
|||
} while (0)
|
||||
|
||||
#define COMMON_INTERCEPT_FUNCTION(name) MSAN_INTERCEPT_FUNC(name)
|
||||
#define COMMON_INTERCEPTOR_UNPOISON_PARAM(ctx, count) \
|
||||
#define COMMON_INTERCEPTOR_UNPOISON_PARAM(count) \
|
||||
UnpoisonParam(count)
|
||||
#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \
|
||||
__msan_unpoison(ptr, size)
|
||||
#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) \
|
||||
CHECK_UNPOISONED_CTX(ctx, ptr, size)
|
||||
#define COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, ptr, size) \
|
||||
#define COMMON_INTERCEPTOR_INITIALIZE_RANGE(ptr, size) \
|
||||
__msan_unpoison(ptr, size)
|
||||
#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \
|
||||
if (msan_init_is_running) return REAL(func)(__VA_ARGS__); \
|
||||
|
|
|
@ -38,7 +38,11 @@
|
|||
#endif // _WIN32
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_INITIALIZE_RANGE
|
||||
#define COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, p, size) {}
|
||||
#define COMMON_INTERCEPTOR_INITIALIZE_RANGE(p, size) {}
|
||||
#endif
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_UNPOISON_PARAM
|
||||
#define COMMON_INTERCEPTOR_UNPOISON_PARAM(count) {}
|
||||
#endif
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_FD_ACCESS
|
||||
|
@ -67,8 +71,7 @@ INTERCEPTOR(char*, textdomain, const char *domainname) {
|
|||
COMMON_INTERCEPTOR_ENTER(ctx, textdomain, domainname);
|
||||
char* domain = REAL(textdomain)(domainname);
|
||||
if (domain) {
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, domain,
|
||||
REAL(strlen)(domain) + 1);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(domain, REAL(strlen)(domain) + 1);
|
||||
}
|
||||
return domain;
|
||||
}
|
||||
|
@ -480,7 +483,7 @@ static void unpoison_tm(void *ctx, __sanitizer_tm *tm) {
|
|||
if (tm->tm_zone) {
|
||||
// Can not use COMMON_INTERCEPTOR_WRITE_RANGE here, because tm->tm_zone
|
||||
// can point to shared memory and tsan would report a data race.
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, tm->tm_zone,
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(tm->tm_zone,
|
||||
REAL(strlen(tm->tm_zone)) + 1);
|
||||
}
|
||||
}
|
||||
|
@ -1069,33 +1072,32 @@ static void unpoison_glob_t(void *ctx, __sanitizer_glob_t *pglob) {
|
|||
}
|
||||
|
||||
static THREADLOCAL __sanitizer_glob_t *pglob_copy;
|
||||
static THREADLOCAL void *glob_ctx;
|
||||
|
||||
static void wrapped_gl_closedir(void *dir) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(1);
|
||||
IndirectExternCall(pglob_copy->gl_closedir)(dir);
|
||||
}
|
||||
|
||||
static void *wrapped_gl_readdir(void *dir) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(1);
|
||||
return IndirectExternCall(pglob_copy->gl_readdir)(dir);
|
||||
}
|
||||
|
||||
static void *wrapped_gl_opendir(const char *s) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 1);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(1);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, REAL(strlen)(s) + 1);
|
||||
return IndirectExternCall(pglob_copy->gl_opendir)(s);
|
||||
}
|
||||
|
||||
static int wrapped_gl_lstat(const char *s, void *st) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 2);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(2);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, REAL(strlen)(s) + 1);
|
||||
return IndirectExternCall(pglob_copy->gl_lstat)(s, st);
|
||||
}
|
||||
|
||||
static int wrapped_gl_stat(const char *s, void *st) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(glob_ctx, 2);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(glob_ctx, s, REAL(strlen)(s) + 1);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(2);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, REAL(strlen)(s) + 1);
|
||||
return IndirectExternCall(pglob_copy->gl_stat)(s, st);
|
||||
}
|
||||
|
||||
|
@ -1115,7 +1117,6 @@ INTERCEPTOR(int, glob, const char *pattern, int flags,
|
|||
Swap(pglob->gl_lstat, glob_copy.gl_lstat);
|
||||
Swap(pglob->gl_stat, glob_copy.gl_stat);
|
||||
pglob_copy = &glob_copy;
|
||||
glob_ctx = ctx;
|
||||
}
|
||||
int res = REAL(glob)(pattern, flags, errfunc, pglob);
|
||||
if (flags & glob_altdirfunc) {
|
||||
|
@ -1126,7 +1127,6 @@ INTERCEPTOR(int, glob, const char *pattern, int flags,
|
|||
Swap(pglob->gl_stat, glob_copy.gl_stat);
|
||||
}
|
||||
pglob_copy = 0;
|
||||
glob_ctx = 0;
|
||||
if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob);
|
||||
return res;
|
||||
}
|
||||
|
@ -1147,7 +1147,6 @@ INTERCEPTOR(int, glob64, const char *pattern, int flags,
|
|||
Swap(pglob->gl_lstat, glob_copy.gl_lstat);
|
||||
Swap(pglob->gl_stat, glob_copy.gl_stat);
|
||||
pglob_copy = &glob_copy;
|
||||
glob_ctx = ctx;
|
||||
}
|
||||
int res = REAL(glob64)(pattern, flags, errfunc, pglob);
|
||||
if (flags & glob_altdirfunc) {
|
||||
|
@ -1158,7 +1157,6 @@ INTERCEPTOR(int, glob64, const char *pattern, int flags,
|
|||
Swap(pglob->gl_stat, glob_copy.gl_stat);
|
||||
}
|
||||
pglob_copy = 0;
|
||||
glob_ctx = 0;
|
||||
if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob);
|
||||
return res;
|
||||
}
|
||||
|
@ -2049,7 +2047,7 @@ INTERCEPTOR(char *, strerror, int errnum) {
|
|||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, strerror, errnum);
|
||||
char *res = REAL(strerror)(errnum);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, REAL(strlen)(res) + 1);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1);
|
||||
return res;
|
||||
}
|
||||
#define INIT_STRERROR COMMON_INTERCEPT_FUNCTION(strerror);
|
||||
|
@ -2105,23 +2103,22 @@ typedef int (*scandir_filter_f)(const struct __sanitizer_dirent *);
|
|||
typedef int (*scandir_compar_f)(const struct __sanitizer_dirent **,
|
||||
const struct __sanitizer_dirent **);
|
||||
|
||||
static THREADLOCAL void *scandir_ctx;
|
||||
static THREADLOCAL scandir_filter_f scandir_filter;
|
||||
static THREADLOCAL scandir_compar_f scandir_compar;
|
||||
|
||||
static int wrapped_scandir_filter(const struct __sanitizer_dirent *dir) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir_ctx, 1);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, dir, dir->d_reclen);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(1);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(dir, dir->d_reclen);
|
||||
return IndirectExternCall(scandir_filter)(dir);
|
||||
}
|
||||
|
||||
static int wrapped_scandir_compar(const struct __sanitizer_dirent **a,
|
||||
const struct __sanitizer_dirent **b) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir_ctx, 2);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, a, sizeof(*a));
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, *a, (*a)->d_reclen);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, b, sizeof(*b));
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir_ctx, *b, (*b)->d_reclen);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(2);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(a, sizeof(*a));
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(*a, (*a)->d_reclen);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(b, sizeof(*b));
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(*b, (*b)->d_reclen);
|
||||
return IndirectExternCall(scandir_compar)(a, b);
|
||||
}
|
||||
|
||||
|
@ -2130,13 +2127,10 @@ INTERCEPTOR(int, scandir, char *dirp, __sanitizer_dirent ***namelist,
|
|||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, scandir, dirp, namelist, filter, compar);
|
||||
if (dirp) COMMON_INTERCEPTOR_READ_RANGE(ctx, dirp, REAL(strlen)(dirp) + 1);
|
||||
CHECK_EQ(0, scandir_ctx);
|
||||
scandir_ctx = ctx;
|
||||
scandir_filter = filter;
|
||||
scandir_compar = compar;
|
||||
int res = REAL(scandir)(dirp, namelist, filter ? wrapped_scandir_filter : 0,
|
||||
compar ? wrapped_scandir_compar : 0);
|
||||
scandir_ctx = 0;
|
||||
scandir_filter = 0;
|
||||
scandir_compar = 0;
|
||||
if (namelist && res > 0) {
|
||||
|
@ -2158,23 +2152,22 @@ typedef int (*scandir64_filter_f)(const struct __sanitizer_dirent64 *);
|
|||
typedef int (*scandir64_compar_f)(const struct __sanitizer_dirent64 **,
|
||||
const struct __sanitizer_dirent64 **);
|
||||
|
||||
static THREADLOCAL void *scandir64_ctx;
|
||||
static THREADLOCAL scandir64_filter_f scandir64_filter;
|
||||
static THREADLOCAL scandir64_compar_f scandir64_compar;
|
||||
|
||||
static int wrapped_scandir64_filter(const struct __sanitizer_dirent64 *dir) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir64_ctx, 1);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, dir, dir->d_reclen);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(1);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(dir, dir->d_reclen);
|
||||
return IndirectExternCall(scandir64_filter)(dir);
|
||||
}
|
||||
|
||||
static int wrapped_scandir64_compar(const struct __sanitizer_dirent64 **a,
|
||||
const struct __sanitizer_dirent64 **b) {
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(scandir64_ctx, 2);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, a, sizeof(*a));
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, *a, (*a)->d_reclen);
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, b, sizeof(*b));
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(scandir64_ctx, *b, (*b)->d_reclen);
|
||||
COMMON_INTERCEPTOR_UNPOISON_PARAM(2);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(a, sizeof(*a));
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(*a, (*a)->d_reclen);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(b, sizeof(*b));
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(*b, (*b)->d_reclen);
|
||||
return IndirectExternCall(scandir64_compar)(a, b);
|
||||
}
|
||||
|
||||
|
@ -2183,14 +2176,11 @@ INTERCEPTOR(int, scandir64, char *dirp, __sanitizer_dirent64 ***namelist,
|
|||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, scandir64, dirp, namelist, filter, compar);
|
||||
if (dirp) COMMON_INTERCEPTOR_READ_RANGE(ctx, dirp, REAL(strlen)(dirp) + 1);
|
||||
CHECK_EQ(0, scandir64_ctx);
|
||||
scandir64_ctx = ctx;
|
||||
scandir64_filter = filter;
|
||||
scandir64_compar = compar;
|
||||
int res =
|
||||
REAL(scandir64)(dirp, namelist, filter ? wrapped_scandir64_filter : 0,
|
||||
compar ? wrapped_scandir64_compar : 0);
|
||||
scandir64_ctx = 0;
|
||||
scandir64_filter = 0;
|
||||
scandir64_compar = 0;
|
||||
if (namelist && res > 0) {
|
||||
|
@ -2718,7 +2708,7 @@ INTERCEPTOR(char *, ether_ntoa, __sanitizer_ether_addr *addr) {
|
|||
COMMON_INTERCEPTOR_ENTER(ctx, ether_ntoa, addr);
|
||||
if (addr) COMMON_INTERCEPTOR_READ_RANGE(ctx, addr, sizeof(*addr));
|
||||
char *res = REAL(ether_ntoa)(addr);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, REAL(strlen)(res) + 1);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1);
|
||||
return res;
|
||||
}
|
||||
INTERCEPTOR(__sanitizer_ether_addr *, ether_aton, char *buf) {
|
||||
|
@ -2726,7 +2716,7 @@ INTERCEPTOR(__sanitizer_ether_addr *, ether_aton, char *buf) {
|
|||
COMMON_INTERCEPTOR_ENTER(ctx, ether_aton, buf);
|
||||
if (buf) COMMON_INTERCEPTOR_READ_RANGE(ctx, buf, REAL(strlen)(buf) + 1);
|
||||
__sanitizer_ether_addr *res = REAL(ether_aton)(buf);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, sizeof(*res));
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, sizeof(*res));
|
||||
return res;
|
||||
}
|
||||
INTERCEPTOR(int, ether_ntohost, char *hostname, __sanitizer_ether_addr *addr) {
|
||||
|
@ -2918,7 +2908,7 @@ INTERCEPTOR(char *, tmpnam, char *s) {
|
|||
if (s)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, s, REAL(strlen)(s) + 1);
|
||||
else
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, REAL(strlen)(res) + 1);
|
||||
COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -2947,7 +2937,7 @@ INTERCEPTOR(char *, tempnam, char *dir, char *pfx) {
|
|||
if (dir) COMMON_INTERCEPTOR_READ_RANGE(ctx, dir, REAL(strlen)(dir) + 1);
|
||||
if (pfx) COMMON_INTERCEPTOR_READ_RANGE(ctx, pfx, REAL(strlen)(pfx) + 1);
|
||||
char *res = REAL(tempnam)(dir, pfx);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, REAL(strlen)(res) + 1);
|
||||
if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1);
|
||||
return res;
|
||||
}
|
||||
#define INIT_TEMPNAM COMMON_INTERCEPT_FUNCTION(tempnam);
|
||||
|
|
|
@ -1914,9 +1914,6 @@ static void HandleRecvmsg(ThreadState *thr, uptr pc,
|
|||
#undef SANITIZER_INTERCEPT_GETADDRINFO
|
||||
|
||||
#define COMMON_INTERCEPT_FUNCTION(name) INTERCEPT_FUNCTION(name)
|
||||
#define COMMON_INTERCEPTOR_UNPOISON_PARAM(ctx, count) \
|
||||
do { \
|
||||
} while (false)
|
||||
|
||||
#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \
|
||||
MemoryAccessRange(((TsanInterceptorContext *)ctx)->thr, \
|
||||
|
|
Loading…
Reference in New Issue