Skip to content

Commit d7c6cad

Browse files
authored
[sanitizer_common] Implement interception on AIX (#138606)
Adjust AIX interceptor support in sanitizer_common. Issue: #138916
1 parent bc7ea63 commit d7c6cad

File tree

5 files changed

+73
-43
lines changed

5 files changed

+73
-43
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,8 @@ INTERCEPTOR(char*, textdomain, const char *domainname) {
481481
#endif
482482

483483
#if SANITIZER_INTERCEPT_STRCMP || SANITIZER_INTERCEPT_MEMCMP
484-
static inline int CharCmpX(unsigned char c1, unsigned char c2) {
484+
[[maybe_unused]] static inline int CharCmpX(unsigned char c1,
485+
unsigned char c2) {
485486
return (c1 == c2) ? 0 : (c1 < c2) ? -1 : 1;
486487
}
487488
#endif
@@ -1350,7 +1351,8 @@ INTERCEPTOR(unsigned long, time, unsigned long *t) {
13501351
#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
13511352
static void unpoison_tm(void *ctx, __sanitizer_tm *tm) {
13521353
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tm, sizeof(*tm));
1353-
#if !SANITIZER_SOLARIS
1354+
// AIX tm struct does not have tm_zone field.
1355+
# if !SANITIZER_SOLARIS && !SANITIZER_AIX
13541356
if (tm->tm_zone) {
13551357
// Can not use COMMON_INTERCEPTOR_WRITE_RANGE here, because tm->tm_zone
13561358
// 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,
17351737
VSPRINTF_INTERCEPTOR_IMPL(vsprintf, str, format, ap)
17361738
#endif
17371739

1740+
# if SANITIZER_INTERCEPT_VASPRINTF
17381741
INTERCEPTOR(int, vasprintf, char **strp, const char *format, va_list ap)
17391742
VASPRINTF_INTERCEPTOR_IMPL(vasprintf, strp, format, ap)
1743+
# endif
17401744

1741-
#if SANITIZER_INTERCEPT_ISOC99_PRINTF
1745+
# if SANITIZER_INTERCEPT_ISOC99_PRINTF
17421746
INTERCEPTOR(int, __isoc99_vprintf, const char *format, va_list ap)
17431747
VPRINTF_INTERCEPTOR_IMPL(__isoc99_vprintf, format, ap)
17441748

@@ -1787,10 +1791,12 @@ INTERCEPTOR(int, __snprintf_chk, char *str, SIZE_T size, int flag,
17871791
FORMAT_INTERCEPTOR_IMPL(__snprintf_chk, vsnprintf, str, size, format)
17881792
#endif
17891793

1794+
# if SANITIZER_INTERCEPT_ASPRINTF
17901795
INTERCEPTOR(int, asprintf, char **strp, const char *format, ...)
17911796
FORMAT_INTERCEPTOR_IMPL(asprintf, vasprintf, strp, format)
1797+
# endif
17921798

1793-
#if SANITIZER_INTERCEPT_ISOC99_PRINTF
1799+
# if SANITIZER_INTERCEPT_ISOC99_PRINTF
17941800
INTERCEPTOR(int, __isoc99_printf, const char *format, ...)
17951801
FORMAT_INTERCEPTOR_IMPL(__isoc99_printf, __isoc99_vprintf, format)
17961802

@@ -1811,17 +1817,24 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,
18111817
#endif // SANITIZER_INTERCEPT_PRINTF
18121818

18131819
#if SANITIZER_INTERCEPT_PRINTF
1814-
#define INIT_PRINTF \
1815-
COMMON_INTERCEPT_FUNCTION_LDBL(printf); \
1816-
COMMON_INTERCEPT_FUNCTION_LDBL(sprintf); \
1817-
COMMON_INTERCEPT_FUNCTION_LDBL(snprintf); \
1818-
COMMON_INTERCEPT_FUNCTION_LDBL(asprintf); \
1819-
COMMON_INTERCEPT_FUNCTION_LDBL(fprintf); \
1820-
COMMON_INTERCEPT_FUNCTION_LDBL(vprintf); \
1821-
COMMON_INTERCEPT_FUNCTION_LDBL(vsprintf); \
1822-
COMMON_INTERCEPT_FUNCTION_LDBL(vsnprintf); \
1823-
COMMON_INTERCEPT_FUNCTION_LDBL(vasprintf); \
1824-
COMMON_INTERCEPT_FUNCTION_LDBL(vfprintf);
1820+
# define INIT_PRINTF_COMMON \
1821+
COMMON_INTERCEPT_FUNCTION_LDBL(printf); \
1822+
COMMON_INTERCEPT_FUNCTION_LDBL(sprintf); \
1823+
COMMON_INTERCEPT_FUNCTION_LDBL(snprintf); \
1824+
COMMON_INTERCEPT_FUNCTION_LDBL(fprintf); \
1825+
COMMON_INTERCEPT_FUNCTION_LDBL(vprintf); \
1826+
COMMON_INTERCEPT_FUNCTION_LDBL(vsprintf); \
1827+
COMMON_INTERCEPT_FUNCTION_LDBL(vsnprintf); \
1828+
COMMON_INTERCEPT_FUNCTION_LDBL(vfprintf);
1829+
# if !SANITIZER_AIX
1830+
// AIX does not have [v]asprintf.
1831+
# define INIT_PRINTF_EXTRA \
1832+
COMMON_INTERCEPT_FUNCTION_LDBL(asprintf); \
1833+
COMMON_INTERCEPT_FUNCTION_LDBL(vasprintf);
1834+
# else
1835+
# define INIT_PRINTF_EXTRA
1836+
# endif
1837+
# define INIT_PRINTF INIT_PRINTF_COMMON INIT_PRINTF_EXTRA
18251838
#else
18261839
#define INIT_PRINTF
18271840
#endif

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ static void ioctl_table_fill() {
7979
_(TIOCMSET, READ, sizeof(int));
8080
_(TIOCNXCL, NONE, 0);
8181
_(TIOCOUTQ, WRITE, sizeof(int));
82+
# if !SANITIZER_AIX
8283
_(TIOCSCTTY, NONE, 0);
84+
# endif
8385
_(TIOCSPGRP, READ, pid_t_sz);
8486
_(TIOCSWINSZ, READ, struct_winsize_sz);
8587

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@
3333

3434
// Platform-specific options.
3535
#if SANITIZER_APPLE
36-
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
36+
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
3737
#elif SANITIZER_WINDOWS64
38-
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
38+
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
39+
#elif SANITIZER_AIX
40+
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
3941
#else
40-
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 1
42+
# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 1
4143
#endif // SANITIZER_APPLE
4244

4345
#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL

compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
141141
#define SI_SOLARIS 0
142142
#endif
143143

144+
#if SANITIZER_AIX
145+
# define SI_NOT_AIX 0
146+
#else
147+
# define SI_NOT_AIX 1
148+
#endif
149+
144150
#if SANITIZER_SOLARIS32
145151
#define SI_SOLARIS32 1
146152
#else
@@ -161,20 +167,20 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
161167

162168
#define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA
163169
#define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)
164-
#define SANITIZER_INTERCEPT_STRCMP SI_NOT_FUCHSIA
170+
#define SANITIZER_INTERCEPT_STRCMP (SI_NOT_FUCHSIA && SI_NOT_AIX)
165171
#define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA
166-
#define SANITIZER_INTERCEPT_STRCASESTR SI_POSIX
172+
#define SANITIZER_INTERCEPT_STRCASESTR (SI_POSIX && SI_NOT_AIX)
167173
#define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA
168174
#define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA
169-
#define SANITIZER_INTERCEPT_STRCHRNUL SI_POSIX_NOT_MAC
175+
#define SANITIZER_INTERCEPT_STRCHRNUL (SI_POSIX_NOT_MAC && SI_NOT_AIX)
170176
#define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA
171177
#define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA
172178
#define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA
173179
#define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS
174180
#define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX
175181
#define SANITIZER_INTERCEPT_MEMSET 1
176-
#define SANITIZER_INTERCEPT_MEMMOVE 1
177-
#define SANITIZER_INTERCEPT_MEMCPY 1
182+
#define SANITIZER_INTERCEPT_MEMMOVE SI_NOT_AIX
183+
#define SANITIZER_INTERCEPT_MEMCPY SI_NOT_AIX
178184
#define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA
179185
#define SANITIZER_INTERCEPT_BCMP \
180186
SANITIZER_INTERCEPT_MEMCMP && \
@@ -233,18 +239,21 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
233239
#define SANITIZER_INTERCEPT_ISOC99_SCANF SI_GLIBC
234240

235241
#ifndef SANITIZER_INTERCEPT_PRINTF
236-
#define SANITIZER_INTERCEPT_PRINTF SI_POSIX
237-
#define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
238-
#define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC
242+
# define SANITIZER_INTERCEPT_ASPRINTF SI_NOT_AIX
243+
# define SANITIZER_INTERCEPT_VASPRINTF SI_NOT_AIX
244+
# define SANITIZER_INTERCEPT_PRINTF SI_POSIX
245+
# define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
246+
# define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC
239247
#endif
240248

241249
#define SANITIZER_INTERCEPT_SETPROCTITLE (SI_FREEBSD || SI_NETBSD)
242250

243251
#define SANITIZER_INTERCEPT___PRINTF_CHK \
244252
(SANITIZER_INTERCEPT_PRINTF && SI_GLIBC)
245253

246-
#define SANITIZER_INTERCEPT_FREXP SI_NOT_FUCHSIA
247-
#define SANITIZER_INTERCEPT_FREXPF SI_POSIX
254+
// AIX libc does not export FREXP and FREXPF.
255+
#define SANITIZER_INTERCEPT_FREXP (SI_NOT_FUCHSIA && SI_NOT_AIX)
256+
#define SANITIZER_INTERCEPT_FREXPF (SI_POSIX && SI_NOT_AIX)
248257
#define SANITIZER_INTERCEPT_FREXPL SI_POSIX
249258

250259
#define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX
@@ -294,7 +303,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
294303
#define SANITIZER_INTERCEPT_ACCEPT4 \
295304
(SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_FREEBSD)
296305
#define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD
297-
#define SANITIZER_INTERCEPT_MODF SI_POSIX
306+
#define SANITIZER_INTERCEPT_MODF (SI_POSIX && SI_NOT_AIX)
298307
#define SANITIZER_INTERCEPT_RECVMSG SI_POSIX
299308
#define SANITIZER_INTERCEPT_SENDMSG SI_POSIX
300309
#define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX
@@ -329,8 +338,9 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
329338
#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX
330339
#define SANITIZER_INTERCEPT_WCSNRTOMBS \
331340
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
332-
#define SANITIZER_INTERCEPT_WCRTOMB \
333-
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
341+
#define SANITIZER_INTERCEPT_WCRTOMB \
342+
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS || \
343+
!SI_NOT_AIX)
334344
#define SANITIZER_INTERCEPT_WCTOMB \
335345
(SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
336346
#define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS
@@ -370,7 +380,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
370380
#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID
371381
#define SANITIZER_INTERCEPT_STATFS \
372382
(SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
373-
#define SANITIZER_INTERCEPT_STATFS64 SI_GLIBC && SANITIZER_HAS_STATFS64
383+
#define SANITIZER_INTERCEPT_STATFS64 \
384+
((SI_GLIBC || !SI_NOT_AIX) && SANITIZER_HAS_STATFS64)
374385
#define SANITIZER_INTERCEPT_STATVFS \
375386
(SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)
376387
#define SANITIZER_INTERCEPT_STATVFS64 SI_GLIBC
@@ -419,10 +430,10 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
419430
#define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX
420431
#define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX
421432
#define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS
422-
#define SANITIZER_INTERCEPT_REMQUO SI_POSIX
423-
#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD)
424-
#define SANITIZER_INTERCEPT_LGAMMA SI_POSIX
425-
#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD)
433+
#define SANITIZER_INTERCEPT_REMQUO (SI_POSIX && SI_NOT_AIX)
434+
#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)
435+
#define SANITIZER_INTERCEPT_LGAMMA (SI_POSIX && SI_NOT_AIX)
436+
#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)
426437
#define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
427438
#define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
428439
#define SANITIZER_INTERCEPT_DRAND48_R SI_GLIBC
@@ -505,11 +516,13 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
505516
#define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE (SI_LINUX || SI_FREEBSD)
506517

507518
#define SI_STAT_LINUX (SI_LINUX && __GLIBC_PREREQ(2, 33))
508-
#define SANITIZER_INTERCEPT_STAT \
509-
(SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \
510-
SI_STAT_LINUX)
511-
#define SANITIZER_INTERCEPT_STAT64 SI_STAT_LINUX && SANITIZER_HAS_STAT64
512-
#define SANITIZER_INTERCEPT_LSTAT (SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX)
519+
#define SANITIZER_INTERCEPT_STAT \
520+
(SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \
521+
SI_STAT_LINUX || !SI_NOT_AIX)
522+
#define SANITIZER_INTERCEPT_STAT64 \
523+
((SI_STAT_LINUX || !SI_NOT_AIX) && SANITIZER_HAS_STAT64)
524+
#define SANITIZER_INTERCEPT_LSTAT \
525+
(SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX || !SI_NOT_AIX)
513526
#define SANITIZER_INTERCEPT___XSTAT \
514527
((!SANITIZER_INTERCEPT_STAT && SI_POSIX) || SI_STAT_LINUX)
515528
#define SANITIZER_INTERCEPT___XSTAT64 SI_GLIBC
@@ -578,7 +591,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
578591
#define SANITIZER_INTERCEPT_PROTOENT_R SI_GLIBC
579592
#define SANITIZER_INTERCEPT_NETENT (SI_LINUX || SI_NETBSD || SI_FREEBSD)
580593
#define SANITIZER_INTERCEPT_SETVBUF \
581-
(SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC)
594+
(SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC || !SI_NOT_AIX)
582595
#define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
583596
#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD
584597
#define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD

compiler-rt/lib/sanitizer_common/sanitizer_redefine_builtins.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# define SANITIZER_REDEFINE_BUILTINS_H
1616

1717
// The asm hack only works with GCC and Clang.
18-
# if !defined(_WIN32)
18+
# if !defined(_WIN32) && !defined(_AIX)
1919

2020
asm(R"(
2121
.set memcpy, __sanitizer_internal_memcpy

0 commit comments

Comments
 (0)