forked from OSchip/llvm-project
[sanitizer] Fix return type of __bzero and __aeabi_mem* interceptors.
llvm-svn: 355231
This commit is contained in:
parent
72e83488f3
commit
ddc4b7c1d6
|
@ -20,14 +20,17 @@ using namespace __asan; // NOLINT
|
||||||
|
|
||||||
void *__asan_memcpy(void *to, const void *from, uptr size) {
|
void *__asan_memcpy(void *to, const void *from, uptr size) {
|
||||||
ASAN_MEMCPY_IMPL(nullptr, to, from, size);
|
ASAN_MEMCPY_IMPL(nullptr, to, from, size);
|
||||||
|
return to;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *__asan_memset(void *block, int c, uptr size) {
|
void *__asan_memset(void *block, int c, uptr size) {
|
||||||
ASAN_MEMSET_IMPL(nullptr, block, c, size);
|
ASAN_MEMSET_IMPL(nullptr, block, c, size);
|
||||||
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *__asan_memmove(void *to, const void *from, uptr size) {
|
void *__asan_memmove(void *to, const void *from, uptr size) {
|
||||||
ASAN_MEMMOVE_IMPL(nullptr, to, from, size);
|
ASAN_MEMMOVE_IMPL(nullptr, to, from, size);
|
||||||
|
return to;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SANITIZER_FUCHSIA || SANITIZER_RTEMS
|
#if SANITIZER_FUCHSIA || SANITIZER_RTEMS
|
||||||
|
|
|
@ -78,46 +78,57 @@ struct AsanInterceptorContext {
|
||||||
// memcpy is called during __asan_init() from the internals of printf(...).
|
// memcpy is called during __asan_init() from the internals of printf(...).
|
||||||
// We do not treat memcpy with to==from as a bug.
|
// We do not treat memcpy with to==from as a bug.
|
||||||
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
|
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
|
||||||
#define ASAN_MEMCPY_IMPL(ctx, to, from, size) \
|
#define ASAN_MEMCPY_IMPL(ctx, to, from, size) \
|
||||||
do { \
|
do { \
|
||||||
if (UNLIKELY(!asan_inited)) return internal_memcpy(to, from, size); \
|
if (UNLIKELY(!asan_inited)) { \
|
||||||
if (asan_init_is_running) { \
|
internal_memcpy(to, from, size); \
|
||||||
return REAL(memcpy)(to, from, size); \
|
break; \
|
||||||
} \
|
} \
|
||||||
ENSURE_ASAN_INITED(); \
|
if (asan_init_is_running) { \
|
||||||
if (flags()->replace_intrin) { \
|
REAL(memcpy)(to, from, size); \
|
||||||
if (to != from) { \
|
break; \
|
||||||
CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
|
} \
|
||||||
} \
|
ENSURE_ASAN_INITED(); \
|
||||||
ASAN_READ_RANGE(ctx, from, size); \
|
if (flags()->replace_intrin) { \
|
||||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
if (to != from) { \
|
||||||
} \
|
CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
|
||||||
return REAL(memcpy)(to, from, size); \
|
} \
|
||||||
|
ASAN_READ_RANGE(ctx, from, size); \
|
||||||
|
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||||
|
} \
|
||||||
|
REAL(memcpy)(to, from, size); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// memset is called inside Printf.
|
// memset is called inside Printf.
|
||||||
#define ASAN_MEMSET_IMPL(ctx, block, c, size) \
|
#define ASAN_MEMSET_IMPL(ctx, block, c, size) \
|
||||||
do { \
|
do { \
|
||||||
if (UNLIKELY(!asan_inited)) return internal_memset(block, c, size); \
|
if (UNLIKELY(!asan_inited)) { \
|
||||||
if (asan_init_is_running) { \
|
internal_memset(block, c, size); \
|
||||||
return REAL(memset)(block, c, size); \
|
break; \
|
||||||
} \
|
} \
|
||||||
ENSURE_ASAN_INITED(); \
|
if (asan_init_is_running) { \
|
||||||
if (flags()->replace_intrin) { \
|
REAL(memset)(block, c, size); \
|
||||||
ASAN_WRITE_RANGE(ctx, block, size); \
|
break; \
|
||||||
} \
|
} \
|
||||||
return REAL(memset)(block, c, size); \
|
ENSURE_ASAN_INITED(); \
|
||||||
|
if (flags()->replace_intrin) { \
|
||||||
|
ASAN_WRITE_RANGE(ctx, block, size); \
|
||||||
|
} \
|
||||||
|
REAL(memset)(block, c, size); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define ASAN_MEMMOVE_IMPL(ctx, to, from, size) \
|
#define ASAN_MEMMOVE_IMPL(ctx, to, from, size) \
|
||||||
do { \
|
do { \
|
||||||
if (UNLIKELY(!asan_inited)) return internal_memmove(to, from, size); \
|
if (UNLIKELY(!asan_inited)) { \
|
||||||
ENSURE_ASAN_INITED(); \
|
internal_memmove(to, from, size); \
|
||||||
if (flags()->replace_intrin) { \
|
break; \
|
||||||
ASAN_READ_RANGE(ctx, from, size); \
|
} \
|
||||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
ENSURE_ASAN_INITED(); \
|
||||||
} \
|
if (flags()->replace_intrin) { \
|
||||||
return internal_memmove(to, from, size); \
|
ASAN_READ_RANGE(ctx, from, size); \
|
||||||
|
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||||
|
} \
|
||||||
|
internal_memmove(to, from, size); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define ASAN_READ_RANGE(ctx, offset, size) \
|
#define ASAN_READ_RANGE(ctx, offset, size) \
|
||||||
|
|
|
@ -1311,17 +1311,17 @@ int OnExit() {
|
||||||
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
|
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
|
||||||
{ \
|
{ \
|
||||||
(void)ctx; \
|
(void)ctx; \
|
||||||
return __msan_memset(block, c, size); \
|
__msan_memset(block, c, size); \
|
||||||
}
|
}
|
||||||
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
|
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
|
||||||
{ \
|
{ \
|
||||||
(void)ctx; \
|
(void)ctx; \
|
||||||
return __msan_memmove(to, from, size); \
|
__msan_memmove(to, from, size); \
|
||||||
}
|
}
|
||||||
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
|
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
|
||||||
{ \
|
{ \
|
||||||
(void)ctx; \
|
(void)ctx; \
|
||||||
return __msan_memcpy(to, from, size); \
|
__msan_memcpy(to, from, size); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COMMON_INTERCEPTOR_COPY_STRING(ctx, to, from, size) \
|
#define COMMON_INTERCEPTOR_COPY_STRING(ctx, to, from, size) \
|
||||||
|
|
|
@ -238,43 +238,48 @@ bool PlatformHasDifferentMemcpyAndMemmove();
|
||||||
|
|
||||||
#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL
|
#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL
|
||||||
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size) \
|
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size) \
|
||||||
{ \
|
do { \
|
||||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) \
|
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) { \
|
||||||
return internal_memset(dst, v, size); \
|
internal_memset(dst, v, size); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
COMMON_INTERCEPTOR_ENTER(ctx, memset, dst, v, size); \
|
COMMON_INTERCEPTOR_ENTER(ctx, memset, dst, v, size); \
|
||||||
if (common_flags()->intercept_intrin) \
|
if (common_flags()->intercept_intrin) \
|
||||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
||||||
return REAL(memset)(dst, v, size); \
|
REAL(memset)(dst, v, size); \
|
||||||
}
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef COMMON_INTERCEPTOR_MEMMOVE_IMPL
|
#ifndef COMMON_INTERCEPTOR_MEMMOVE_IMPL
|
||||||
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size) \
|
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size) \
|
||||||
{ \
|
do { \
|
||||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) \
|
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) { \
|
||||||
return internal_memmove(dst, src, size); \
|
internal_memmove(dst, src, size); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
COMMON_INTERCEPTOR_ENTER(ctx, memmove, dst, src, size); \
|
COMMON_INTERCEPTOR_ENTER(ctx, memmove, dst, src, size); \
|
||||||
if (common_flags()->intercept_intrin) { \
|
if (common_flags()->intercept_intrin) { \
|
||||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
||||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size); \
|
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size); \
|
||||||
} \
|
} \
|
||||||
return REAL(memmove)(dst, src, size); \
|
REAL(memmove)(dst, src, size); \
|
||||||
}
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef COMMON_INTERCEPTOR_MEMCPY_IMPL
|
#ifndef COMMON_INTERCEPTOR_MEMCPY_IMPL
|
||||||
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, dst, src, size) \
|
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, dst, src, size) \
|
||||||
{ \
|
do { \
|
||||||
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) { \
|
if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) { \
|
||||||
return internal_memmove(dst, src, size); \
|
internal_memmove(dst, src, size); \
|
||||||
|
break; \
|
||||||
} \
|
} \
|
||||||
COMMON_INTERCEPTOR_ENTER(ctx, memcpy, dst, src, size); \
|
COMMON_INTERCEPTOR_ENTER(ctx, memcpy, dst, src, size); \
|
||||||
if (common_flags()->intercept_intrin) { \
|
if (common_flags()->intercept_intrin) { \
|
||||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size); \
|
||||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size); \
|
COMMON_INTERCEPTOR_READ_RANGE(ctx, src, size); \
|
||||||
} \
|
} \
|
||||||
return REAL(memcpy)(dst, src, size); \
|
REAL(memcpy)(dst, src, size); \
|
||||||
}
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef COMMON_INTERCEPTOR_MMAP_IMPL
|
#ifndef COMMON_INTERCEPTOR_MMAP_IMPL
|
||||||
|
@ -771,6 +776,7 @@ INTERCEPTOR(char *, strpbrk, const char *s1, const char *s2) {
|
||||||
INTERCEPTOR(void *, memset, void *dst, int v, uptr size) {
|
INTERCEPTOR(void *, memset, void *dst, int v, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size);
|
||||||
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INIT_MEMSET COMMON_INTERCEPT_FUNCTION(memset)
|
#define INIT_MEMSET COMMON_INTERCEPT_FUNCTION(memset)
|
||||||
|
@ -782,6 +788,7 @@ INTERCEPTOR(void *, memset, void *dst, int v, uptr size) {
|
||||||
INTERCEPTOR(void *, memmove, void *dst, const void *src, uptr size) {
|
INTERCEPTOR(void *, memmove, void *dst, const void *src, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size);
|
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size);
|
||||||
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INIT_MEMMOVE COMMON_INTERCEPT_FUNCTION(memmove)
|
#define INIT_MEMMOVE COMMON_INTERCEPT_FUNCTION(memmove)
|
||||||
|
@ -802,6 +809,7 @@ INTERCEPTOR(void *, memcpy, void *dst, const void *src, uptr size) {
|
||||||
} else {
|
} else {
|
||||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size);
|
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, dst, src, size);
|
||||||
}
|
}
|
||||||
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INIT_MEMCPY \
|
#define INIT_MEMCPY \
|
||||||
|
@ -5446,63 +5454,63 @@ INTERCEPTOR(int, capset, void *hdrp, const void *datap) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SANITIZER_INTERCEPT_AEABI_MEM
|
#if SANITIZER_INTERCEPT_AEABI_MEM
|
||||||
INTERCEPTOR(void *, __aeabi_memmove, void *to, const void *from, uptr size) {
|
INTERCEPTOR(void, __aeabi_memmove, void *to, const void *from, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memmove4, void *to, const void *from, uptr size) {
|
INTERCEPTOR(void, __aeabi_memmove4, void *to, const void *from, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memmove8, void *to, const void *from, uptr size) {
|
INTERCEPTOR(void, __aeabi_memmove8, void *to, const void *from, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memcpy, void *to, const void *from, uptr size) {
|
INTERCEPTOR(void, __aeabi_memcpy, void *to, const void *from, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memcpy4, void *to, const void *from, uptr size) {
|
INTERCEPTOR(void, __aeabi_memcpy4, void *to, const void *from, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memcpy8, void *to, const void *from, uptr size) {
|
INTERCEPTOR(void, __aeabi_memcpy8, void *to, const void *from, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note the argument order.
|
// Note the argument order.
|
||||||
INTERCEPTOR(void *, __aeabi_memset, void *block, uptr size, int c) {
|
INTERCEPTOR(void, __aeabi_memset, void *block, uptr size, int c) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memset4, void *block, uptr size, int c) {
|
INTERCEPTOR(void, __aeabi_memset4, void *block, uptr size, int c) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memset8, void *block, uptr size, int c) {
|
INTERCEPTOR(void, __aeabi_memset8, void *block, uptr size, int c) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memclr, void *block, uptr size) {
|
INTERCEPTOR(void, __aeabi_memclr, void *block, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memclr4, void *block, uptr size) {
|
INTERCEPTOR(void, __aeabi_memclr4, void *block, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERCEPTOR(void *, __aeabi_memclr8, void *block, uptr size) {
|
INTERCEPTOR(void, __aeabi_memclr8, void *block, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||||
}
|
}
|
||||||
|
@ -5525,7 +5533,7 @@ INTERCEPTOR(void *, __aeabi_memclr8, void *block, uptr size) {
|
||||||
#endif // SANITIZER_INTERCEPT_AEABI_MEM
|
#endif // SANITIZER_INTERCEPT_AEABI_MEM
|
||||||
|
|
||||||
#if SANITIZER_INTERCEPT___BZERO
|
#if SANITIZER_INTERCEPT___BZERO
|
||||||
INTERCEPTOR(void *, __bzero, void *block, uptr size) {
|
INTERCEPTOR(void, __bzero, void *block, uptr size) {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, 0, size);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue