[sanitizer_common] Implement interception on AIX (#138606)
Adjust AIX interceptor support in sanitizer_common. Issue: https://github.com/llvm/llvm-project/issues/138916
This commit is contained in:
@@ -481,7 +481,8 @@ INTERCEPTOR(char*, textdomain, const char *domainname) {
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_STRCMP || SANITIZER_INTERCEPT_MEMCMP
|
||||
static inline int CharCmpX(unsigned char c1, unsigned char c2) {
|
||||
[[maybe_unused]] static inline int CharCmpX(unsigned char c1,
|
||||
unsigned char c2) {
|
||||
return (c1 == c2) ? 0 : (c1 < c2) ? -1 : 1;
|
||||
}
|
||||
#endif
|
||||
@@ -1350,7 +1351,8 @@ INTERCEPTOR(unsigned long, time, unsigned long *t) {
|
||||
#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
|
||||
static void unpoison_tm(void *ctx, __sanitizer_tm *tm) {
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tm, sizeof(*tm));
|
||||
#if !SANITIZER_SOLARIS
|
||||
// AIX tm struct does not have tm_zone field.
|
||||
# if !SANITIZER_SOLARIS && !SANITIZER_AIX
|
||||
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.
|
||||
@@ -1735,10 +1737,12 @@ INTERCEPTOR(int, __vsprintf_chk, char *str, int flag, SIZE_T size_to,
|
||||
VSPRINTF_INTERCEPTOR_IMPL(vsprintf, str, format, ap)
|
||||
#endif
|
||||
|
||||
# if SANITIZER_INTERCEPT_VASPRINTF
|
||||
INTERCEPTOR(int, vasprintf, char **strp, const char *format, va_list ap)
|
||||
VASPRINTF_INTERCEPTOR_IMPL(vasprintf, strp, format, ap)
|
||||
# endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_ISOC99_PRINTF
|
||||
# if SANITIZER_INTERCEPT_ISOC99_PRINTF
|
||||
INTERCEPTOR(int, __isoc99_vprintf, const char *format, va_list ap)
|
||||
VPRINTF_INTERCEPTOR_IMPL(__isoc99_vprintf, format, ap)
|
||||
|
||||
@@ -1787,10 +1791,12 @@ INTERCEPTOR(int, __snprintf_chk, char *str, SIZE_T size, int flag,
|
||||
FORMAT_INTERCEPTOR_IMPL(__snprintf_chk, vsnprintf, str, size, format)
|
||||
#endif
|
||||
|
||||
# if SANITIZER_INTERCEPT_ASPRINTF
|
||||
INTERCEPTOR(int, asprintf, char **strp, const char *format, ...)
|
||||
FORMAT_INTERCEPTOR_IMPL(asprintf, vasprintf, strp, format)
|
||||
# endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_ISOC99_PRINTF
|
||||
# if SANITIZER_INTERCEPT_ISOC99_PRINTF
|
||||
INTERCEPTOR(int, __isoc99_printf, const char *format, ...)
|
||||
FORMAT_INTERCEPTOR_IMPL(__isoc99_printf, __isoc99_vprintf, format)
|
||||
|
||||
@@ -1811,17 +1817,24 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,
|
||||
#endif // SANITIZER_INTERCEPT_PRINTF
|
||||
|
||||
#if SANITIZER_INTERCEPT_PRINTF
|
||||
#define INIT_PRINTF \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(printf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(sprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(snprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(asprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(fprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vsprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vsnprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vasprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vfprintf);
|
||||
# define INIT_PRINTF_COMMON \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(printf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(sprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(snprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(fprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vsprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vsnprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vfprintf);
|
||||
# if !SANITIZER_AIX
|
||||
// AIX does not have [v]asprintf.
|
||||
# define INIT_PRINTF_EXTRA \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(asprintf); \
|
||||
COMMON_INTERCEPT_FUNCTION_LDBL(vasprintf);
|
||||
# else
|
||||
# define INIT_PRINTF_EXTRA
|
||||
# endif
|
||||
# define INIT_PRINTF INIT_PRINTF_COMMON INIT_PRINTF_EXTRA
|
||||
#else
|
||||
#define INIT_PRINTF
|
||||
#endif
|
||||
|
||||
@@ -79,7 +79,9 @@ static void ioctl_table_fill() {
|
||||
_(TIOCMSET, READ, sizeof(int));
|
||||
_(TIOCNXCL, NONE, 0);
|
||||
_(TIOCOUTQ, WRITE, sizeof(int));
|
||||
# if !SANITIZER_AIX
|
||||
_(TIOCSCTTY, NONE, 0);
|
||||
# endif
|
||||
_(TIOCSPGRP, READ, pid_t_sz);
|
||||
_(TIOCSWINSZ, READ, struct_winsize_sz);
|
||||
|
||||
|
||||
@@ -33,11 +33,13 @@
|
||||
|
||||
// Platform-specific options.
|
||||
#if SANITIZER_APPLE
|
||||
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
|
||||
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
|
||||
#elif SANITIZER_WINDOWS64
|
||||
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
|
||||
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
|
||||
#elif SANITIZER_AIX
|
||||
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
|
||||
#else
|
||||
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 1
|
||||
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 1
|
||||
#endif // SANITIZER_APPLE
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL
|
||||
|
||||
@@ -141,6 +141,12 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SI_SOLARIS 0
|
||||
#endif
|
||||
|
||||
#if SANITIZER_AIX
|
||||
# define SI_NOT_AIX 0
|
||||
#else
|
||||
# define SI_NOT_AIX 1
|
||||
#endif
|
||||
|
||||
#if SANITIZER_SOLARIS32
|
||||
#define SI_SOLARIS32 1
|
||||
#else
|
||||
@@ -161,20 +167,20 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
|
||||
#define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)
|
||||
#define SANITIZER_INTERCEPT_STRCMP SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRCMP (SI_NOT_FUCHSIA && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRCASESTR SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_STRCASESTR (SI_POSIX && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRCHRNUL SI_POSIX_NOT_MAC
|
||||
#define SANITIZER_INTERCEPT_STRCHRNUL (SI_POSIX_NOT_MAC && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS
|
||||
#define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_MEMSET 1
|
||||
#define SANITIZER_INTERCEPT_MEMMOVE 1
|
||||
#define SANITIZER_INTERCEPT_MEMCPY 1
|
||||
#define SANITIZER_INTERCEPT_MEMMOVE SI_NOT_AIX
|
||||
#define SANITIZER_INTERCEPT_MEMCPY SI_NOT_AIX
|
||||
#define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_BCMP \
|
||||
SANITIZER_INTERCEPT_MEMCMP && \
|
||||
@@ -233,9 +239,11 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_ISOC99_SCANF SI_GLIBC
|
||||
|
||||
#ifndef SANITIZER_INTERCEPT_PRINTF
|
||||
#define SANITIZER_INTERCEPT_PRINTF SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
|
||||
#define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC
|
||||
# define SANITIZER_INTERCEPT_ASPRINTF SI_NOT_AIX
|
||||
# define SANITIZER_INTERCEPT_VASPRINTF SI_NOT_AIX
|
||||
# define SANITIZER_INTERCEPT_PRINTF SI_POSIX
|
||||
# define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
|
||||
# define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC
|
||||
#endif
|
||||
|
||||
#define SANITIZER_INTERCEPT_SETPROCTITLE (SI_FREEBSD || SI_NETBSD)
|
||||
@@ -243,8 +251,9 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT___PRINTF_CHK \
|
||||
(SANITIZER_INTERCEPT_PRINTF && SI_GLIBC)
|
||||
|
||||
#define SANITIZER_INTERCEPT_FREXP SI_NOT_FUCHSIA
|
||||
#define SANITIZER_INTERCEPT_FREXPF SI_POSIX
|
||||
// AIX libc does not export FREXP and FREXPF.
|
||||
#define SANITIZER_INTERCEPT_FREXP (SI_NOT_FUCHSIA && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_FREXPF (SI_POSIX && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_FREXPL SI_POSIX
|
||||
|
||||
#define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX
|
||||
@@ -294,7 +303,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_ACCEPT4 \
|
||||
(SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_FREEBSD)
|
||||
#define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD
|
||||
#define SANITIZER_INTERCEPT_MODF SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_MODF (SI_POSIX && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_RECVMSG SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_SENDMSG SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX
|
||||
@@ -329,8 +338,9 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX
|
||||
#define SANITIZER_INTERCEPT_WCSNRTOMBS \
|
||||
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
|
||||
#define SANITIZER_INTERCEPT_WCRTOMB \
|
||||
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
|
||||
#define SANITIZER_INTERCEPT_WCRTOMB \
|
||||
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS || \
|
||||
!SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_WCTOMB \
|
||||
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
|
||||
#define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS
|
||||
@@ -370,7 +380,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID
|
||||
#define SANITIZER_INTERCEPT_STATFS \
|
||||
(SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
|
||||
#define SANITIZER_INTERCEPT_STATFS64 SI_GLIBC && SANITIZER_HAS_STATFS64
|
||||
#define SANITIZER_INTERCEPT_STATFS64 \
|
||||
((SI_GLIBC || !SI_NOT_AIX) && SANITIZER_HAS_STATFS64)
|
||||
#define SANITIZER_INTERCEPT_STATVFS \
|
||||
(SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)
|
||||
#define SANITIZER_INTERCEPT_STATVFS64 SI_GLIBC
|
||||
@@ -419,10 +430,10 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS
|
||||
#define SANITIZER_INTERCEPT_REMQUO SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD)
|
||||
#define SANITIZER_INTERCEPT_LGAMMA SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD)
|
||||
#define SANITIZER_INTERCEPT_REMQUO (SI_POSIX && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_LGAMMA (SI_POSIX && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
|
||||
#define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
|
||||
#define SANITIZER_INTERCEPT_DRAND48_R SI_GLIBC
|
||||
@@ -505,11 +516,13 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE (SI_LINUX || SI_FREEBSD)
|
||||
|
||||
#define SI_STAT_LINUX (SI_LINUX && __GLIBC_PREREQ(2, 33))
|
||||
#define SANITIZER_INTERCEPT_STAT \
|
||||
(SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \
|
||||
SI_STAT_LINUX)
|
||||
#define SANITIZER_INTERCEPT_STAT64 SI_STAT_LINUX && SANITIZER_HAS_STAT64
|
||||
#define SANITIZER_INTERCEPT_LSTAT (SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX)
|
||||
#define SANITIZER_INTERCEPT_STAT \
|
||||
(SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \
|
||||
SI_STAT_LINUX || !SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_STAT64 \
|
||||
((SI_STAT_LINUX || !SI_NOT_AIX) && SANITIZER_HAS_STAT64)
|
||||
#define SANITIZER_INTERCEPT_LSTAT \
|
||||
(SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX || !SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT___XSTAT \
|
||||
((!SANITIZER_INTERCEPT_STAT && SI_POSIX) || SI_STAT_LINUX)
|
||||
#define SANITIZER_INTERCEPT___XSTAT64 SI_GLIBC
|
||||
@@ -578,7 +591,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_PROTOENT_R SI_GLIBC
|
||||
#define SANITIZER_INTERCEPT_NETENT (SI_LINUX || SI_NETBSD || SI_FREEBSD)
|
||||
#define SANITIZER_INTERCEPT_SETVBUF \
|
||||
(SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC)
|
||||
(SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC || !SI_NOT_AIX)
|
||||
#define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
|
||||
#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD
|
||||
#define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# define SANITIZER_REDEFINE_BUILTINS_H
|
||||
|
||||
// The asm hack only works with GCC and Clang.
|
||||
# if !defined(_WIN32)
|
||||
# if !defined(_WIN32) && !defined(_AIX)
|
||||
|
||||
asm(R"(
|
||||
.set memcpy, __sanitizer_internal_memcpy
|
||||
|
||||
Reference in New Issue
Block a user