Skip to content

[sanitizer_common] Implement address sanitizer on AIX: platform specific support #131866

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion compiler-rt/cmake/base-config-ix.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ include(CompilerRTDarwinUtils)
check_include_file(unwind.h HAVE_UNWIND_H)

# Used by sanitizer_common and tests.
check_include_file(rpc/xdr.h HAVE_RPC_XDR_H)
if (${CMAKE_SYSTEM_NAME} MATCHES AIX)
check_include_file(tirpc/rpc/xdr.h HAVE_RPC_XDR_H)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not specific to this patch: I am a bit concerned about this. If the CI or build system does not have this header, then changes that break the correspondence in layout would not be identified.

A separate patch should be posted to require the presence of this header (with an opt-out via CMake option). @vitalybuka, what process would you advise in terms of giving advance warning for buildbot maintainers?

else()
check_include_file(rpc/xdr.h HAVE_RPC_XDR_H)
endif()
if (NOT HAVE_RPC_XDR_H)
set(HAVE_RPC_XDR_H 0)
endif()
Expand Down
2 changes: 2 additions & 0 deletions compiler-rt/lib/sanitizer_common/sanitizer_errno.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
# define __errno_location _errno
#elif SANITIZER_HAIKU
# define __errno_location _errnop
#elif SANITIZER_AIX
# define __errno_location _Errno
#endif

extern "C" int *__errno_location();
Expand Down
10 changes: 8 additions & 2 deletions compiler-rt/lib/sanitizer_common/sanitizer_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
!defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) && \
!(defined(__sun__) && defined(__svr4__)) && !defined(__HAIKU__) && \
!defined(__wasi__)
!defined(__wasi__) && !defined(_AIX)
# error "This operating system is not supported"
#endif

Expand All @@ -32,6 +32,12 @@
# define SANITIZER_LINUX 0
#endif

#if defined(_AIX)
# define SANITIZER_AIX 1
#else
# define SANITIZER_AIX 0
#endif

#if defined(__GLIBC__)
# define SANITIZER_GLIBC 1
#else
Expand Down Expand Up @@ -151,7 +157,7 @@

#define SANITIZER_POSIX \
(SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU)
SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU || SANITIZER_AIX)

#if __LP64__ || defined(_WIN64)
# define SANITIZER_WORDSIZE 64
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
// Must go after undef _FILE_OFFSET_BITS.
#include "sanitizer_platform.h"

#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe sanitizer_platform_limits_aix.cpp ?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why though? AIX is a POSIX platform and the logic (and structure) here seems to be common except for the usual type/structure size/layout differences.

#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
// Must go after undef _FILE_OFFSET_BITS.
#include "sanitizer_glibc_version.h"

Expand Down Expand Up @@ -61,11 +61,11 @@
#endif

#if !SANITIZER_ANDROID
#if !SANITIZER_HAIKU
#include <sys/mount.h>
#endif
#include <sys/timeb.h>
#include <utmpx.h>
# if !SANITIZER_HAIKU && !SANITIZER_AIX
# include <sys/mount.h>
# endif
# include <sys/timeb.h>
# include <utmpx.h>
#endif

#if SANITIZER_LINUX
Expand Down Expand Up @@ -112,11 +112,15 @@ typedef struct user_fpregs elf_fpregset_t;
#endif

#if !SANITIZER_ANDROID
#include <ifaddrs.h>
#if !SANITIZER_HAIKU
#include <sys/ucontext.h>
#include <wordexp.h>
#endif
# if !SANITIZER_AIX
# include <ifaddrs.h>
# else
# include <netinet/in.h>
# endif
# if !SANITIZER_HAIKU
# include <sys/ucontext.h>
# include <wordexp.h>
# endif
#endif

#if SANITIZER_LINUX
Expand Down Expand Up @@ -182,6 +186,17 @@ typedef struct user_fpregs elf_fpregset_t;
#include <sys/ioctl.h>
#endif

# if SANITIZER_AIX
# include <netinet/ip_mroute.h>
# include <stropts.h>
# include <sys/ioctl.h>
# include <sys/statfs.h>
# include <unistd.h>
# if HAVE_RPC_XDR_H
# include <tirpc/rpc/xdr.h>
# endif
# endif

// Include these after system headers to avoid name clashes and ambiguities.
# include "sanitizer_common.h"
# include "sanitizer_internal_defs.h"
Expand Down Expand Up @@ -557,14 +572,14 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);

const unsigned IOCTL_NOT_PRESENT = 0;

unsigned IOCTL_FIONBIO = FIONBIO;
#if !SANITIZER_HAIKU
unsigned IOCTL_FIOASYNC = FIOASYNC;
ioctl_alttype IOCTL_FIONBIO = FIONBIO;
# if !SANITIZER_HAIKU
ioctl_alttype IOCTL_FIOASYNC = FIOASYNC;
unsigned IOCTL_FIOCLEX = FIOCLEX;
unsigned IOCTL_FIOGETOWN = FIOGETOWN;
unsigned IOCTL_FIONCLEX = FIONCLEX;
unsigned IOCTL_FIOSETOWN = FIOSETOWN;
#endif
ioctl_alttype IOCTL_FIOSETOWN = FIOSETOWN;
# endif
unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
unsigned IOCTL_SIOCATMARK = SIOCATMARK;
unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;
Expand All @@ -584,30 +599,32 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_SIOCSIFMETRIC = SIOCSIFMETRIC;
unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;
unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
ioctl_alttype IOCTL_SIOCSPGRP = SIOCSPGRP;

#if !SANITIZER_HAIKU
unsigned IOCTL_TIOCCONS = TIOCCONS;
# if !SANITIZER_HAIKU
ioctl_alttype IOCTL_TIOCCONS = TIOCCONS;
unsigned IOCTL_TIOCGETD = TIOCGETD;
unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
unsigned IOCTL_TIOCPKT = TIOCPKT;
unsigned IOCTL_TIOCSETD = TIOCSETD;
unsigned IOCTL_TIOCSTI = TIOCSTI;
#endif
ioctl_alttype IOCTL_TIOCPKT = TIOCPKT;
ioctl_alttype IOCTL_TIOCSETD = TIOCSETD;
ioctl_alttype IOCTL_TIOCSTI = TIOCSTI;
# endif

unsigned IOCTL_TIOCEXCL = TIOCEXCL;
unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
unsigned IOCTL_TIOCMBIC = TIOCMBIC;
unsigned IOCTL_TIOCMBIS = TIOCMBIS;
ioctl_alttype IOCTL_TIOCMBIC = TIOCMBIC;
ioctl_alttype IOCTL_TIOCMBIS = TIOCMBIS;
unsigned IOCTL_TIOCMGET = TIOCMGET;
unsigned IOCTL_TIOCMSET = TIOCMSET;
ioctl_alttype IOCTL_TIOCMSET = TIOCMSET;
unsigned IOCTL_TIOCNXCL = TIOCNXCL;
unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;
# if !SANITIZER_AIX
unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;
unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
#if SANITIZER_LINUX && !SANITIZER_ANDROID
# endif
ioctl_alttype IOCTL_TIOCSPGRP = TIOCSPGRP;
ioctl_alttype IOCTL_TIOCSWINSZ = TIOCSWINSZ;
# if SANITIZER_LINUX && !SANITIZER_ANDROID
unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
#endif
Expand Down Expand Up @@ -1069,6 +1086,9 @@ CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_addrlen);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_canonname);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_addr);
# if SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(addrinfo, ai_eflags);
# endif

CHECK_TYPE_SIZE(hostent);
CHECK_SIZE_AND_OFFSET(hostent, h_name);
Expand Down Expand Up @@ -1115,11 +1135,13 @@ COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
CHECK_SIZE_AND_OFFSET(dirent, d_ino);
#if SANITIZER_APPLE
CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);
#elif SANITIZER_FREEBSD || SANITIZER_HAIKU
# elif SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(dirent, d_offset);
# elif SANITIZER_FREEBSD || SANITIZER_HAIKU
// There is no 'd_off' field on FreeBSD.
#else
# else
CHECK_SIZE_AND_OFFSET(dirent, d_off);
#endif
# endif
CHECK_SIZE_AND_OFFSET(dirent, d_reclen);

#if SANITIZER_GLIBC
Expand Down Expand Up @@ -1194,6 +1216,10 @@ CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_offs);
#endif
# if SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(wordexp_t, we_sflags);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_soffs);
# endif

CHECK_TYPE_SIZE(tm);
CHECK_SIZE_AND_OFFSET(tm, tm_sec);
Expand All @@ -1205,10 +1231,12 @@ CHECK_SIZE_AND_OFFSET(tm, tm_year);
CHECK_SIZE_AND_OFFSET(tm, tm_wday);
CHECK_SIZE_AND_OFFSET(tm, tm_yday);
CHECK_SIZE_AND_OFFSET(tm, tm_isdst);
# if !SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(tm, tm_gmtoff);
CHECK_SIZE_AND_OFFSET(tm, tm_zone);
# endif

#if SANITIZER_LINUX
# if SANITIZER_LINUX
CHECK_TYPE_SIZE(mntent);
CHECK_SIZE_AND_OFFSET(mntent, mnt_fsname);
CHECK_SIZE_AND_OFFSET(mntent, mnt_dir);
Expand Down Expand Up @@ -1258,7 +1286,7 @@ CHECK_TYPE_SIZE(clock_t);
CHECK_TYPE_SIZE(clockid_t);
#endif

#if !SANITIZER_ANDROID && !SANITIZER_HAIKU
# if !SANITIZER_ANDROID && !SANITIZER_HAIKU && !SANITIZER_AIX
CHECK_TYPE_SIZE(ifaddrs);
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);
Expand Down
Loading
Loading