forked from OSchip/llvm-project
Replace WRAP in interceptors with memset, memmove and memcpy implementation
Summary: According https://reviews.llvm.org/D27659#625093 WRAP adds confusing stack frame. Reviewers: eugenis Subscribers: kubabrecka, llvm-commits Differential Revision: https://reviews.llvm.org/D28039 llvm-svn: 290382
This commit is contained in:
parent
55de3a2449
commit
9895f7959a
|
@ -81,6 +81,51 @@ struct AsanInterceptorContext {
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
// memcpy is called during __asan_init() from the internals of printf(...).
|
||||
// We do not treat memcpy with to==from as a bug.
|
||||
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
|
||||
#define ASAN_MEMCPY_IMPL(ctx, to, from, size) \
|
||||
do { \
|
||||
if (UNLIKELY(!asan_inited)) return internal_memcpy(to, from, size); \
|
||||
if (asan_init_is_running) { \
|
||||
return REAL(memcpy)(to, from, size); \
|
||||
} \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
if (flags()->replace_intrin) { \
|
||||
if (to != from) { \
|
||||
CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
|
||||
} \
|
||||
ASAN_READ_RANGE(ctx, from, size); \
|
||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||
} \
|
||||
return REAL(memcpy)(to, from, size); \
|
||||
} while (0)
|
||||
|
||||
// memset is called inside Printf.
|
||||
#define ASAN_MEMSET_IMPL(ctx, block, c, size) \
|
||||
do { \
|
||||
if (UNLIKELY(!asan_inited)) return internal_memset(block, c, size); \
|
||||
if (asan_init_is_running) { \
|
||||
return REAL(memset)(block, c, size); \
|
||||
} \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
if (flags()->replace_intrin) { \
|
||||
ASAN_WRITE_RANGE(ctx, block, size); \
|
||||
} \
|
||||
return REAL(memset)(block, c, size); \
|
||||
} while (0)
|
||||
|
||||
#define ASAN_MEMMOVE_IMPL(ctx, to, from, size) \
|
||||
do { \
|
||||
if (UNLIKELY(!asan_inited)) return internal_memmove(to, from, size); \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
if (flags()->replace_intrin) { \
|
||||
ASAN_READ_RANGE(ctx, from, size); \
|
||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||
} \
|
||||
return internal_memmove(to, from, size); \
|
||||
} while (0)
|
||||
|
||||
#define ASAN_READ_RANGE(ctx, offset, size) \
|
||||
ACCESS_MEMORY_RANGE(ctx, offset, size, false)
|
||||
#define ASAN_WRITE_RANGE(ctx, offset, size) \
|
||||
|
@ -198,10 +243,35 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
|
|||
} else { \
|
||||
*begin = *end = 0; \
|
||||
}
|
||||
// Asan needs custom handling of these:
|
||||
#undef SANITIZER_INTERCEPT_MEMSET
|
||||
#undef SANITIZER_INTERCEPT_MEMMOVE
|
||||
#undef SANITIZER_INTERCEPT_MEMCPY
|
||||
|
||||
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
|
||||
do { \
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, memmove); \
|
||||
ASAN_MEMMOVE_IMPL(ctx, to, from, size); \
|
||||
} while (false)
|
||||
|
||||
// At least on 10.7 and 10.8 both memcpy() and memmove() are being replaced
|
||||
// with WRAP(memcpy). As a result, false positives are reported for
|
||||
// memmove() calls. If we just disable error reporting with
|
||||
// ASAN_OPTIONS=replace_intrin=0, memmove() is still replaced with
|
||||
// internal_memcpy(), which may lead to crashes, see
|
||||
// http://llvm.org/bugs/show_bug.cgi?id=16362.
|
||||
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
|
||||
do { \
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, memcpy); \
|
||||
if (PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE) { \
|
||||
ASAN_MEMCPY_IMPL(ctx, to, from, size); \
|
||||
} else { \
|
||||
ASAN_MEMMOVE_IMPL(ctx, to, from, size); \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
|
||||
do { \
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, memset); \
|
||||
ASAN_MEMSET_IMPL(ctx, block, c, size); \
|
||||
} while (false)
|
||||
|
||||
#include "sanitizer_common/sanitizer_common_interceptors.inc"
|
||||
|
||||
// Syscall interceptors don't have contexts, we don't support suppressions
|
||||
|
@ -389,90 +459,18 @@ INTERCEPTOR(void, __cxa_throw, void *a, void *b, void *c) {
|
|||
}
|
||||
#endif
|
||||
|
||||
// memcpy is called during __asan_init() from the internals of printf(...).
|
||||
// We do not treat memcpy with to==from as a bug.
|
||||
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
|
||||
#define ASAN_MEMCPY_IMPL(ctx, to, from, size) do { \
|
||||
if (UNLIKELY(!asan_inited)) return internal_memcpy(to, from, size); \
|
||||
if (asan_init_is_running) { \
|
||||
return REAL(memcpy)(to, from, size); \
|
||||
} \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
if (flags()->replace_intrin) { \
|
||||
if (to != from) { \
|
||||
CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
|
||||
} \
|
||||
ASAN_READ_RANGE(ctx, from, size); \
|
||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||
} \
|
||||
return REAL(memcpy)(to, from, size); \
|
||||
} while (0)
|
||||
|
||||
|
||||
void *__asan_memcpy(void *to, const void *from, uptr size) {
|
||||
ASAN_MEMCPY_IMPL(nullptr, to, from, size);
|
||||
}
|
||||
|
||||
// memset is called inside Printf.
|
||||
#define ASAN_MEMSET_IMPL(ctx, block, c, size) do { \
|
||||
if (UNLIKELY(!asan_inited)) return internal_memset(block, c, size); \
|
||||
if (asan_init_is_running) { \
|
||||
return REAL(memset)(block, c, size); \
|
||||
} \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
if (flags()->replace_intrin) { \
|
||||
ASAN_WRITE_RANGE(ctx, block, size); \
|
||||
} \
|
||||
return REAL(memset)(block, c, size); \
|
||||
} while (0)
|
||||
|
||||
void *__asan_memset(void *block, int c, uptr size) {
|
||||
ASAN_MEMSET_IMPL(nullptr, block, c, size);
|
||||
}
|
||||
|
||||
#define ASAN_MEMMOVE_IMPL(ctx, to, from, size) do { \
|
||||
if (UNLIKELY(!asan_inited)) \
|
||||
return internal_memmove(to, from, size); \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
if (flags()->replace_intrin) { \
|
||||
ASAN_READ_RANGE(ctx, from, size); \
|
||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||
} \
|
||||
return internal_memmove(to, from, size); \
|
||||
} while (0)
|
||||
|
||||
void *__asan_memmove(void *to, const void *from, uptr size) {
|
||||
ASAN_MEMMOVE_IMPL(nullptr, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void*, memmove, void *to, const void *from, uptr size) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, memmove);
|
||||
ASAN_MEMMOVE_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void*, memcpy, void *to, const void *from, uptr size) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, memcpy);
|
||||
if (PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE) {
|
||||
ASAN_MEMCPY_IMPL(ctx, to, from, size);
|
||||
} else {
|
||||
// At least on 10.7 and 10.8 both memcpy() and memmove() are being replaced
|
||||
// with WRAP(memcpy). As a result, false positives are reported for
|
||||
// memmove() calls. If we just disable error reporting with
|
||||
// ASAN_OPTIONS=replace_intrin=0, memmove() is still replaced with
|
||||
// internal_memcpy(), which may lead to crashes, see
|
||||
// http://llvm.org/bugs/show_bug.cgi?id=16362.
|
||||
ASAN_MEMMOVE_IMPL(ctx, to, from, size);
|
||||
}
|
||||
}
|
||||
|
||||
INTERCEPTOR(void*, memset, void *block, int c, uptr size) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, memset);
|
||||
ASAN_MEMSET_IMPL(ctx, block, c, size);
|
||||
}
|
||||
|
||||
#if ASAN_INTERCEPT_INDEX
|
||||
# if ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX
|
||||
INTERCEPTOR(char*, index, const char *string, int c)
|
||||
|
|
|
@ -45,6 +45,8 @@ using __sanitizer::atomic_uintptr_t;
|
|||
|
||||
DECLARE_REAL(SIZE_T, strlen, const char *s)
|
||||
DECLARE_REAL(SIZE_T, strnlen, const char *s, SIZE_T maxlen)
|
||||
DECLARE_REAL(void *, memcpy, void *dest, const void *src, uptr n)
|
||||
DECLARE_REAL(void *, memset, void *dest, int c, uptr n)
|
||||
|
||||
#if SANITIZER_FREEBSD
|
||||
#define __errno_location __error
|
||||
|
@ -152,10 +154,6 @@ INTERCEPTOR(SSIZE_T, readlink, const char *path, char *buf, SIZE_T bufsiz) {
|
|||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) {
|
||||
return __msan_memcpy(dest, src, n);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, mempcpy, void *dest, const void *src, SIZE_T n) {
|
||||
return (char *)__msan_memcpy(dest, src, n) + n;
|
||||
}
|
||||
|
@ -170,14 +168,6 @@ INTERCEPTOR(void *, memccpy, void *dest, const void *src, int c, SIZE_T n) {
|
|||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, memmove, void *dest, const void *src, SIZE_T n) {
|
||||
return __msan_memmove(dest, src, n);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, memset, void *s, int c, SIZE_T n) {
|
||||
return __msan_memset(s, c, n);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, bcopy, const void *src, void *dest, SIZE_T n) {
|
||||
return __msan_memmove(dest, src, n);
|
||||
}
|
||||
|
@ -1354,11 +1344,23 @@ int OnExit() {
|
|||
*begin = *end = 0; \
|
||||
}
|
||||
|
||||
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
|
||||
{ \
|
||||
(void)ctx; \
|
||||
return __msan_memset(block, c, size); \
|
||||
}
|
||||
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
|
||||
{ \
|
||||
(void)ctx; \
|
||||
return __msan_memmove(to, from, size); \
|
||||
}
|
||||
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
|
||||
{ \
|
||||
(void)ctx; \
|
||||
return __msan_memcpy(to, from, size); \
|
||||
}
|
||||
|
||||
#include "sanitizer_common/sanitizer_platform_interceptors.h"
|
||||
// Msan needs custom handling of these:
|
||||
#undef SANITIZER_INTERCEPT_MEMSET
|
||||
#undef SANITIZER_INTERCEPT_MEMMOVE
|
||||
#undef SANITIZER_INTERCEPT_MEMCPY
|
||||
#include "sanitizer_common/sanitizer_common_interceptors.inc"
|
||||
|
||||
#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) CHECK_UNPOISONED(p, s)
|
||||
|
|
|
@ -30,6 +30,9 @@
|
|||
// COMMON_INTERCEPTOR_SET_PTHREAD_NAME
|
||||
// COMMON_INTERCEPTOR_HANDLE_RECVMSG
|
||||
// COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED
|
||||
// COMMON_INTERCEPTOR_MEMSET_IMPL
|
||||
// COMMON_INTERCEPTOR_MEMMOVE_IMPL
|
||||
// COMMON_INTERCEPTOR_MEMCPY_IMPL
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "interception/interception.h"
|
||||
|
@ -163,6 +166,52 @@
|
|||
COMMON_INTERCEPT_FUNCTION(fn)
|
||||
#endif
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL
|
||||
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size) \
|
||||
{ \
|
||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) \
|
||||
return internal_memset(dst, v, size); \
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memset, dst, v, size); \
|
||||
if (common_flags()->intercept_intrin) \
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
||||
return REAL(memset)(dst, v, size); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_MEMMOVE_IMPL
|
||||
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size) \
|
||||
{ \
|
||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) \
|
||||
return internal_memmove(dst, src, size); \
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memmove, dst, src, size); \
|
||||
if (common_flags()->intercept_intrin) { \
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size); \
|
||||
} \
|
||||
return REAL(memmove)(dst, src, size); \
|
||||
}
|
||||
#endif
|
||||
|
||||
// On OS X, calling internal_memcpy here will cause memory corruptions,
|
||||
// because memcpy and memmove are actually aliases of the same
|
||||
// implementation. We need to use internal_memmove here.
|
||||
// N.B.: If we switch this to internal_ we'll have to use internal_memmove
|
||||
// due to memcpy being an alias of memmove on OS X.
|
||||
#ifndef COMMON_INTERCEPTOR_MEMCPY_IMPL
|
||||
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, dst, src, size) \
|
||||
{ \
|
||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) { \
|
||||
return internal_memmove(dst, src, size); \
|
||||
} \
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memcpy, dst, src, size); \
|
||||
if (common_flags()->intercept_intrin) { \
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size); \
|
||||
} \
|
||||
return REAL(memcpy)(dst, src, size); \
|
||||
}
|
||||
#endif
|
||||
|
||||
struct FileMetadata {
|
||||
// For open_memstream().
|
||||
char **addr;
|
||||
|
@ -565,14 +614,9 @@ INTERCEPTOR(char *, strpbrk, const char *s1, const char *s2) {
|
|||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_MEMSET
|
||||
INTERCEPTOR(void*, memset, void *dst, int v, uptr size) {
|
||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)
|
||||
return internal_memset(dst, v, size);
|
||||
INTERCEPTOR(void *, memset, void *dst, int v, uptr size) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memset, dst, v, size);
|
||||
if (common_flags()->intercept_intrin)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size);
|
||||
return REAL(memset)(dst, v, size);
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size);
|
||||
}
|
||||
|
||||
#define INIT_MEMSET COMMON_INTERCEPT_FUNCTION(memset)
|
||||
|
@ -581,16 +625,9 @@ INTERCEPTOR(void*, memset, void *dst, int v, uptr size) {
|
|||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_MEMMOVE
|
||||
INTERCEPTOR(void*, memmove, void *dst, const void *src, uptr size) {
|
||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)
|
||||
return internal_memmove(dst, src, size);
|
||||
INTERCEPTOR(void *, memmove, void *dst, const void *src, uptr size) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memmove, dst, src, size);
|
||||
if (common_flags()->intercept_intrin) {
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size);
|
||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size);
|
||||
}
|
||||
return REAL(memmove)(dst, src, size);
|
||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size);
|
||||
}
|
||||
|
||||
#define INIT_MEMMOVE COMMON_INTERCEPT_FUNCTION(memmove)
|
||||
|
@ -599,22 +636,9 @@ INTERCEPTOR(void*, memmove, void *dst, const void *src, uptr size) {
|
|||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_MEMCPY
|
||||
INTERCEPTOR(void*, memcpy, void *dst, const void *src, uptr size) {
|
||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) {
|
||||
// On OS X, calling internal_memcpy here will cause memory corruptions,
|
||||
// because memcpy and memmove are actually aliases of the same
|
||||
// implementation. We need to use internal_memmove here.
|
||||
return internal_memmove(dst, src, size);
|
||||
}
|
||||
INTERCEPTOR(void *, memcpy, void *dst, const void *src, uptr size) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memcpy, dst, src, size);
|
||||
if (common_flags()->intercept_intrin) {
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size);
|
||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size);
|
||||
}
|
||||
// N.B.: If we switch this to internal_ we'll have to use internal_memmove
|
||||
// due to memcpy being an alias of memmove on OS X.
|
||||
return REAL(memcpy)(dst, src, size);
|
||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, dst, src, size);
|
||||
}
|
||||
|
||||
#define INIT_MEMCPY COMMON_INTERCEPT_FUNCTION(memcpy)
|
||||
|
@ -4837,47 +4861,67 @@ INTERCEPTOR(int, capset, void *hdrp, const void *datap) {
|
|||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_AEABI_MEM
|
||||
DECLARE_REAL_AND_INTERCEPTOR(void *, memmove, void *, const void *, uptr)
|
||||
DECLARE_REAL_AND_INTERCEPTOR(void *, memcpy, void *, const void *, uptr)
|
||||
DECLARE_REAL_AND_INTERCEPTOR(void *, memset, void *, int, uptr)
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memmove, void *to, const void *from, uptr size) {
|
||||
return WRAP(memmove)(to, from, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memmove4, void *to, const void *from, uptr size) {
|
||||
return WRAP(memmove)(to, from, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memmove8, void *to, const void *from, uptr size) {
|
||||
return WRAP(memmove)(to, from, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memcpy, void *to, const void *from, uptr size) {
|
||||
return WRAP(memcpy)(to, from, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memcpy4, void *to, const void *from, uptr size) {
|
||||
return WRAP(memcpy)(to, from, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memcpy8, void *to, const void *from, uptr size) {
|
||||
return WRAP(memcpy)(to, from, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
||||
}
|
||||
|
||||
// Note the argument order.
|
||||
INTERCEPTOR(void *, __aeabi_memset, void *block, uptr size, int c) {
|
||||
return WRAP(memset)(block, c, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memset4, void *block, uptr size, int c) {
|
||||
return WRAP(memset)(block, c, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memset8, void *block, uptr size, int c) {
|
||||
return WRAP(memset)(block, c, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memclr, void *block, uptr size) {
|
||||
return WRAP(memset)(block, 0, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memclr4, void *block, uptr size) {
|
||||
return WRAP(memset)(block, 0, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||
}
|
||||
|
||||
INTERCEPTOR(void *, __aeabi_memclr8, void *block, uptr size) {
|
||||
return WRAP(memset)(block, 0, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||
}
|
||||
|
||||
#define INIT_AEABI_MEM \
|
||||
COMMON_INTERCEPT_FUNCTION(__aeabi_memmove); \
|
||||
COMMON_INTERCEPT_FUNCTION(__aeabi_memmove4); \
|
||||
|
@ -4896,11 +4940,11 @@ INTERCEPTOR(void *, __aeabi_memclr8, void *block, uptr size) {
|
|||
#endif // SANITIZER_INTERCEPT_AEABI_MEM
|
||||
|
||||
#if SANITIZER_INTERCEPT___BZERO
|
||||
DECLARE_REAL_AND_INTERCEPTOR(void *, memset, void *, int, uptr);
|
||||
|
||||
INTERCEPTOR(void *, __bzero, void *block, uptr size) {
|
||||
return WRAP(memset)(block, 0, size);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||
}
|
||||
|
||||
#define INIT___BZERO COMMON_INTERCEPT_FUNCTION(__bzero);
|
||||
#else
|
||||
#define INIT___BZERO
|
||||
|
|
Loading…
Reference in New Issue