1326943Sdim//===-- sanitizer_platform_limits_solaris.h -------------------------------===// 2326943Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6326943Sdim// 7326943Sdim//===----------------------------------------------------------------------===// 8326943Sdim// 9326943Sdim// This file is a part of Sanitizer common code. 10326943Sdim// 11326943Sdim// Sizes and layouts of platform-specific Solaris data structures. 12326943Sdim//===----------------------------------------------------------------------===// 13326943Sdim 14326943Sdim#ifndef SANITIZER_PLATFORM_LIMITS_SOLARIS_H 15326943Sdim#define SANITIZER_PLATFORM_LIMITS_SOLARIS_H 16326943Sdim 17326943Sdim#if SANITIZER_SOLARIS 18326943Sdim 19326943Sdim#include "sanitizer_internal_defs.h" 20326943Sdim#include "sanitizer_platform.h" 21326943Sdim 22326943Sdimnamespace __sanitizer { 23326943Sdimextern unsigned struct_utsname_sz; 24326943Sdimextern unsigned struct_stat_sz; 25326943Sdimextern unsigned struct_stat64_sz; 26326943Sdimextern unsigned struct_rusage_sz; 27326943Sdimextern unsigned siginfo_t_sz; 28326943Sdimextern unsigned struct_itimerval_sz; 29326943Sdimextern unsigned pthread_t_sz; 30326943Sdimextern unsigned pthread_mutex_t_sz; 31326943Sdimextern unsigned pthread_cond_t_sz; 32326943Sdimextern unsigned pid_t_sz; 33326943Sdimextern unsigned timeval_sz; 34326943Sdimextern unsigned uid_t_sz; 35326943Sdimextern unsigned gid_t_sz; 36326943Sdimextern unsigned mbstate_t_sz; 37326943Sdimextern unsigned struct_timezone_sz; 38326943Sdimextern unsigned struct_tms_sz; 39326943Sdimextern unsigned struct_itimerspec_sz; 40326943Sdimextern unsigned struct_sigevent_sz; 41326943Sdimextern unsigned struct_sched_param_sz; 42326943Sdimextern unsigned struct_statfs64_sz; 43326943Sdimextern unsigned struct_statfs_sz; 44326943Sdimextern unsigned struct_sockaddr_sz; 45326943Sdimextern unsigned ucontext_t_sz; 46326943Sdim 47326943Sdimextern unsigned struct_timespec_sz; 48326943Sdimextern unsigned struct_rlimit_sz; 49326943Sdimextern unsigned struct_utimbuf_sz; 50326943Sdim 51326943Sdimstruct __sanitizer_sem_t { 52326943Sdim //u64 data[6]; 53326943Sdim u32 sem_count; 54326943Sdim u16 sem_type; 55326943Sdim u16 sem_magic; 56326943Sdim u64 sem_pad1[3]; 57326943Sdim u64 sem_pad2[2]; 58326943Sdim}; 59326943Sdim 60326943Sdimstruct __sanitizer_ipc_perm { 61326943Sdim unsigned int uid; // uid_t 62326943Sdim unsigned int gid; // gid_t 63326943Sdim unsigned int cuid; // uid_t 64326943Sdim unsigned int cgid; // gid_t 65326943Sdim unsigned int mode; // mode_t 66326943Sdim unsigned int seq; // uint_t 67326943Sdim int key; // key_t 68326943Sdim#if !defined(_LP64) 69326943Sdim int pad[4]; 70326943Sdim#endif 71360784Sdim}; 72326943Sdim 73326943Sdimstruct __sanitizer_shmid_ds { 74326943Sdim __sanitizer_ipc_perm shm_perm; 75326943Sdim unsigned long shm_segsz; // size_t 76326943Sdim unsigned long shm_flags; // uintptr_t 77326943Sdim unsigned short shm_lkcnt; // ushort_t 78326943Sdim int shm_lpid; // pid_t 79326943Sdim int shm_cpid; // pid_t 80326943Sdim unsigned long shm_nattch; // shmatt_t 81326943Sdim unsigned long shm_cnattch; // ulong_t 82326943Sdim#if defined(_LP64) 83326943Sdim long shm_atime; // time_t 84326943Sdim long shm_dtime; 85326943Sdim long shm_ctime; 86326943Sdim void *shm_amp; 87326943Sdim u64 shm_gransize; // uint64_t 88326943Sdim u64 shm_allocated; // uint64_t 89326943Sdim u64 shm_pad4[1]; // int64_t 90326943Sdim#else 91326943Sdim long shm_atime; // time_t 92326943Sdim int shm_pad1; // int32_t 93326943Sdim long shm_dtime; // time_t 94326943Sdim int shm_pad2; // int32_t 95326943Sdim long shm_ctime; // time_t 96326943Sdim void *shm_amp; 97326943Sdim u64 shm_gransize; // uint64_t 98326943Sdim u64 shm_allocated; // uint64_t 99326943Sdim#endif 100326943Sdim}; 101326943Sdim 102326943Sdimextern unsigned struct_statvfs_sz; 103326943Sdim#if SANITIZER_SOLARIS32 104326943Sdimextern unsigned struct_statvfs64_sz; 105326943Sdim#endif 106326943Sdim 107326943Sdimstruct __sanitizer_iovec { 108326943Sdim void *iov_base; 109326943Sdim uptr iov_len; 110326943Sdim}; 111326943Sdim 112326943Sdimstruct __sanitizer_ifaddrs { 113326943Sdim struct __sanitizer_ifaddrs *ifa_next; 114326943Sdim char *ifa_name; 115326943Sdim u64 ifa_flags; // uint64_t 116326943Sdim void *ifa_addr; // (struct sockaddr *) 117326943Sdim void *ifa_netmask; // (struct sockaddr *) 118326943Sdim // This is a union on Linux. 119326943Sdim# ifdef ifa_dstaddr 120326943Sdim# undef ifa_dstaddr 121326943Sdim# endif 122326943Sdim void *ifa_dstaddr; // (struct sockaddr *) 123326943Sdim void *ifa_data; 124326943Sdim}; 125326943Sdim 126326943Sdimtypedef unsigned __sanitizer_pthread_key_t; 127326943Sdim 128326943Sdimstruct __sanitizer_XDR { 129326943Sdim int x_op; 130326943Sdim void *x_ops; 131326943Sdim uptr x_public; 132326943Sdim uptr x_private; 133326943Sdim uptr x_base; 134326943Sdim unsigned x_handy; 135326943Sdim}; 136326943Sdim 137326943Sdimconst int __sanitizer_XDR_ENCODE = 0; 138326943Sdimconst int __sanitizer_XDR_DECODE = 1; 139326943Sdimconst int __sanitizer_XDR_FREE = 2; 140326943Sdim 141326943Sdimstruct __sanitizer_passwd { 142326943Sdim char *pw_name; 143326943Sdim char *pw_passwd; 144326943Sdim unsigned int pw_uid; // uid_t 145326943Sdim unsigned int pw_gid; // gid_t 146326943Sdim char *pw_age; 147326943Sdim char *pw_comment; 148326943Sdim char *pw_gecos; 149326943Sdim char *pw_dir; 150326943Sdim char *pw_shell; 151326943Sdim}; 152326943Sdim 153326943Sdimstruct __sanitizer_group { 154326943Sdim char *gr_name; 155326943Sdim char *gr_passwd; 156326943Sdim int gr_gid; 157326943Sdim char **gr_mem; 158326943Sdim}; 159326943Sdim 160326943Sdimtypedef long __sanitizer_time_t; 161326943Sdim 162341825Sdimtypedef long __sanitizer_suseconds_t; 163341825Sdim 164341825Sdimstruct __sanitizer_timeval { 165341825Sdim __sanitizer_time_t tv_sec; 166341825Sdim __sanitizer_suseconds_t tv_usec; 167341825Sdim}; 168341825Sdim 169341825Sdimstruct __sanitizer_itimerval { 170341825Sdim struct __sanitizer_timeval it_interval; 171341825Sdim struct __sanitizer_timeval it_value; 172341825Sdim}; 173341825Sdim 174326943Sdimstruct __sanitizer_timeb { 175326943Sdim __sanitizer_time_t time; 176326943Sdim unsigned short millitm; 177326943Sdim short timezone; 178326943Sdim short dstflag; 179326943Sdim}; 180326943Sdim 181326943Sdimstruct __sanitizer_ether_addr { 182326943Sdim u8 octet[6]; 183326943Sdim}; 184326943Sdim 185326943Sdimstruct __sanitizer_tm { 186326943Sdim int tm_sec; 187326943Sdim int tm_min; 188326943Sdim int tm_hour; 189326943Sdim int tm_mday; 190326943Sdim int tm_mon; 191326943Sdim int tm_year; 192326943Sdim int tm_wday; 193326943Sdim int tm_yday; 194326943Sdim int tm_isdst; 195326943Sdim}; 196326943Sdim 197326943Sdimstruct __sanitizer_msghdr { 198326943Sdim void *msg_name; 199326943Sdim unsigned msg_namelen; 200326943Sdim struct __sanitizer_iovec *msg_iov; 201326943Sdim unsigned msg_iovlen; 202326943Sdim void *msg_control; 203326943Sdim unsigned msg_controllen; 204326943Sdim int msg_flags; 205326943Sdim}; 206326943Sdimstruct __sanitizer_cmsghdr { 207326943Sdim unsigned cmsg_len; 208326943Sdim int cmsg_level; 209326943Sdim int cmsg_type; 210326943Sdim}; 211326943Sdim 212344779Sdim#if SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64) 213326943Sdimstruct __sanitizer_dirent { 214326943Sdim unsigned long long d_ino; 215326943Sdim long long d_off; 216326943Sdim unsigned short d_reclen; 217326943Sdim // more fields that we don't care about 218326943Sdim}; 219326943Sdim#else 220326943Sdimstruct __sanitizer_dirent { 221326943Sdim unsigned long d_ino; 222326943Sdim long d_off; 223326943Sdim unsigned short d_reclen; 224326943Sdim // more fields that we don't care about 225326943Sdim}; 226326943Sdim#endif 227326943Sdim 228326943Sdimstruct __sanitizer_dirent64 { 229326943Sdim unsigned long long d_ino; 230326943Sdim unsigned long long d_off; 231326943Sdim unsigned short d_reclen; 232326943Sdim // more fields that we don't care about 233326943Sdim}; 234326943Sdim 235326943Sdimtypedef long __sanitizer_clock_t; 236326943Sdimtypedef int __sanitizer_clockid_t; 237326943Sdim 238326943Sdim// This thing depends on the platform. We are only interested in the upper 239360784Sdim// limit. Verified with a compiler assert in .cpp. 240326943Sdimunion __sanitizer_pthread_attr_t { 241360784Sdim char size[128]; 242326943Sdim void *align; 243326943Sdim}; 244326943Sdim 245326943Sdimstruct __sanitizer_sigset_t { 246326943Sdim // uint32_t * 4 247326943Sdim unsigned int __bits[4]; 248326943Sdim}; 249326943Sdim 250326943Sdimstruct __sanitizer_siginfo { 251326943Sdim // The size is determined by looking at sizeof of real siginfo_t on linux. 252326943Sdim u64 opaque[128 / sizeof(u64)]; 253326943Sdim}; 254326943Sdim 255326943Sdimusing __sanitizer_sighandler_ptr = void (*)(int sig); 256326943Sdimusing __sanitizer_sigactionhandler_ptr = 257326943Sdim void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx); 258326943Sdim 259326943Sdimstruct __sanitizer_sigaction { 260326943Sdim int sa_flags; 261326943Sdim union { 262326943Sdim __sanitizer_sigactionhandler_ptr sigaction; 263326943Sdim __sanitizer_sighandler_ptr handler; 264326943Sdim }; 265326943Sdim __sanitizer_sigset_t sa_mask; 266326943Sdim#if !defined(_LP64) 267326943Sdim int sa_resv[2]; 268326943Sdim#endif 269326943Sdim}; 270326943Sdim 271326943Sdimstruct __sanitizer_kernel_sigset_t { 272326943Sdim u8 sig[8]; 273326943Sdim}; 274326943Sdim 275326943Sdimstruct __sanitizer_kernel_sigaction_t { 276326943Sdim union { 277326943Sdim void (*handler)(int signo); 278326943Sdim void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx); 279326943Sdim }; 280326943Sdim unsigned long sa_flags; 281326943Sdim void (*sa_restorer)(void); 282326943Sdim __sanitizer_kernel_sigset_t sa_mask; 283326943Sdim}; 284326943Sdim 285326943Sdimextern const uptr sig_ign; 286326943Sdimextern const uptr sig_dfl; 287326943Sdimextern const uptr sig_err; 288326943Sdimextern const uptr sa_siginfo; 289326943Sdim 290326943Sdimextern int af_inet; 291326943Sdimextern int af_inet6; 292326943Sdimuptr __sanitizer_in_addr_sz(int af); 293326943Sdim 294326943Sdimstruct __sanitizer_dl_phdr_info { 295326943Sdim uptr dlpi_addr; 296326943Sdim const char *dlpi_name; 297326943Sdim const void *dlpi_phdr; 298326943Sdim short dlpi_phnum; 299326943Sdim}; 300326943Sdim 301326943Sdimextern unsigned struct_ElfW_Phdr_sz; 302326943Sdim 303326943Sdimstruct __sanitizer_addrinfo { 304326943Sdim int ai_flags; 305326943Sdim int ai_family; 306326943Sdim int ai_socktype; 307326943Sdim int ai_protocol; 308326943Sdim#if defined(__sparcv9) 309326943Sdim int _ai_pad; 310326943Sdim#endif 311326943Sdim unsigned ai_addrlen; 312326943Sdim char *ai_canonname; 313326943Sdim void *ai_addr; 314326943Sdim struct __sanitizer_addrinfo *ai_next; 315326943Sdim}; 316326943Sdim 317326943Sdimstruct __sanitizer_hostent { 318326943Sdim char *h_name; 319326943Sdim char **h_aliases; 320326943Sdim int h_addrtype; 321326943Sdim int h_length; 322326943Sdim char **h_addr_list; 323326943Sdim}; 324326943Sdim 325326943Sdimstruct __sanitizer_pollfd { 326326943Sdim int fd; 327326943Sdim short events; 328326943Sdim short revents; 329326943Sdim}; 330326943Sdim 331326943Sdimtypedef unsigned long __sanitizer_nfds_t; 332326943Sdim 333326943Sdimstruct __sanitizer_glob_t { 334326943Sdim uptr gl_pathc; 335326943Sdim char **gl_pathv; 336326943Sdim uptr gl_offs; 337326943Sdim char **gl_pathp; 338326943Sdim int gl_pathn; 339326943Sdim}; 340326943Sdim 341326943Sdimextern int glob_nomatch; 342326943Sdimextern int glob_altdirfunc; 343326943Sdim 344326943Sdimextern unsigned path_max; 345326943Sdim 346326943Sdimstruct __sanitizer_wordexp_t { 347326943Sdim uptr we_wordc; 348326943Sdim char **we_wordv; 349326943Sdim uptr we_offs; 350326943Sdim char **we_wordp; 351326943Sdim int we_wordn; 352326943Sdim}; 353326943Sdim 354326943Sdimtypedef void __sanitizer_FILE; 355326943Sdim#define SANITIZER_HAS_STRUCT_FILE 0 356326943Sdim 357326943Sdim// This simplifies generic code 358326943Sdim#define struct_shminfo_sz -1 359326943Sdim#define struct_shm_info_sz -1 360326943Sdim#define shmctl_shm_stat -1 361326943Sdim#define shmctl_ipc_info -1 362326943Sdim#define shmctl_shm_info -1 363326943Sdim 364326943Sdimextern int shmctl_ipc_stat; 365326943Sdim 366326943Sdimextern unsigned struct_utmp_sz; 367326943Sdimextern unsigned struct_utmpx_sz; 368326943Sdim 369326943Sdimextern int map_fixed; 370326943Sdim 371326943Sdim// ioctl arguments 372326943Sdimstruct __sanitizer_ifconf { 373326943Sdim int ifc_len; 374326943Sdim union { 375326943Sdim void *ifcu_req; 376326943Sdim } ifc_ifcu; 377326943Sdim}; 378326943Sdim 379326943Sdim// <sys/ioccom.h> 380326943Sdim#define IOC_NRBITS 8 381326943Sdim#define IOC_TYPEBITS 8 382326943Sdim#define IOC_SIZEBITS 12 383326943Sdim#define IOC_DIRBITS 4 384326943Sdim#undef IOC_NONE 385326943Sdim#define IOC_NONE 2U // IOC_VOID 386326943Sdim#define IOC_READ 4U // IOC_OUT 387326943Sdim#define IOC_WRITE 8U // IOC_IN 388326943Sdim 389326943Sdim#define IOC_NRMASK ((1 << IOC_NRBITS) - 1) 390326943Sdim#define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1) 391326943Sdim#define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1) 392326943Sdim#define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1) 393326943Sdim#define IOC_NRSHIFT 0 394326943Sdim#define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS) 395326943Sdim#define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS) 396326943Sdim#define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS) 397326943Sdim 398326943Sdim#define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK) 399326943Sdim#define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK) 400326943Sdim#define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK) 401326943Sdim 402326943Sdim#if defined(__sparc__) 403326943Sdim// In sparc the 14 bits SIZE field overlaps with the 404326943Sdim// least significant bit of DIR, so either IOC_READ or 405326943Sdim// IOC_WRITE shall be 1 in order to get a non-zero SIZE. 406326943Sdim#define IOC_SIZE(nr) \ 407326943Sdim ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff)) 408326943Sdim#else 409326943Sdim#define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK) 410326943Sdim#endif 411326943Sdim 412326943Sdimextern unsigned struct_ifreq_sz; 413326943Sdimextern unsigned struct_termios_sz; 414326943Sdimextern unsigned struct_winsize_sz; 415326943Sdim 416326943Sdimextern unsigned struct_sioc_sg_req_sz; 417326943Sdimextern unsigned struct_sioc_vif_req_sz; 418326943Sdim 419326943Sdim// ioctl request identifiers 420326943Sdim 421326943Sdim// A special value to mark ioctls that are not present on the target platform, 422326943Sdim// when it can not be determined without including any system headers. 423326943Sdimextern const unsigned IOCTL_NOT_PRESENT; 424326943Sdim 425326943Sdimextern unsigned IOCTL_FIOASYNC; 426326943Sdimextern unsigned IOCTL_FIOCLEX; 427326943Sdimextern unsigned IOCTL_FIOGETOWN; 428326943Sdimextern unsigned IOCTL_FIONBIO; 429326943Sdimextern unsigned IOCTL_FIONCLEX; 430326943Sdimextern unsigned IOCTL_FIOSETOWN; 431326943Sdimextern unsigned IOCTL_SIOCADDMULTI; 432326943Sdimextern unsigned IOCTL_SIOCATMARK; 433326943Sdimextern unsigned IOCTL_SIOCDELMULTI; 434326943Sdimextern unsigned IOCTL_SIOCGIFADDR; 435326943Sdimextern unsigned IOCTL_SIOCGIFBRDADDR; 436326943Sdimextern unsigned IOCTL_SIOCGIFCONF; 437326943Sdimextern unsigned IOCTL_SIOCGIFDSTADDR; 438326943Sdimextern unsigned IOCTL_SIOCGIFFLAGS; 439326943Sdimextern unsigned IOCTL_SIOCGIFMETRIC; 440326943Sdimextern unsigned IOCTL_SIOCGIFMTU; 441326943Sdimextern unsigned IOCTL_SIOCGIFNETMASK; 442326943Sdimextern unsigned IOCTL_SIOCGPGRP; 443326943Sdimextern unsigned IOCTL_SIOCSIFADDR; 444326943Sdimextern unsigned IOCTL_SIOCSIFBRDADDR; 445326943Sdimextern unsigned IOCTL_SIOCSIFDSTADDR; 446326943Sdimextern unsigned IOCTL_SIOCSIFFLAGS; 447326943Sdimextern unsigned IOCTL_SIOCSIFMETRIC; 448326943Sdimextern unsigned IOCTL_SIOCSIFMTU; 449326943Sdimextern unsigned IOCTL_SIOCSIFNETMASK; 450326943Sdimextern unsigned IOCTL_SIOCSPGRP; 451326943Sdimextern unsigned IOCTL_TIOCEXCL; 452326943Sdimextern unsigned IOCTL_TIOCGETD; 453326943Sdimextern unsigned IOCTL_TIOCGPGRP; 454326943Sdimextern unsigned IOCTL_TIOCGWINSZ; 455326943Sdimextern unsigned IOCTL_TIOCMBIC; 456326943Sdimextern unsigned IOCTL_TIOCMBIS; 457326943Sdimextern unsigned IOCTL_TIOCMGET; 458326943Sdimextern unsigned IOCTL_TIOCMSET; 459326943Sdimextern unsigned IOCTL_TIOCNOTTY; 460326943Sdimextern unsigned IOCTL_TIOCNXCL; 461326943Sdimextern unsigned IOCTL_TIOCOUTQ; 462326943Sdimextern unsigned IOCTL_TIOCPKT; 463326943Sdimextern unsigned IOCTL_TIOCSCTTY; 464326943Sdimextern unsigned IOCTL_TIOCSETD; 465326943Sdimextern unsigned IOCTL_TIOCSPGRP; 466326943Sdimextern unsigned IOCTL_TIOCSTI; 467326943Sdimextern unsigned IOCTL_TIOCSWINSZ; 468326943Sdimextern unsigned IOCTL_MTIOCGET; 469326943Sdimextern unsigned IOCTL_MTIOCTOP; 470326943Sdim 471326943Sdimextern const int si_SEGV_MAPERR; 472326943Sdimextern const int si_SEGV_ACCERR; 473326943Sdim} // namespace __sanitizer 474326943Sdim 475326943Sdim#define CHECK_TYPE_SIZE(TYPE) \ 476326943Sdim COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE)) 477326943Sdim 478326943Sdim#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \ 479326943Sdim COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \ 480326943Sdim sizeof(((CLASS *) NULL)->MEMBER)); \ 481326943Sdim COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \ 482326943Sdim offsetof(CLASS, MEMBER)) 483326943Sdim 484326943Sdim// For sigaction, which is a function and struct at the same time, 485326943Sdim// and thus requires explicit "struct" in sizeof() expression. 486326943Sdim#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \ 487326943Sdim COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \ 488326943Sdim sizeof(((struct CLASS *) NULL)->MEMBER)); \ 489326943Sdim COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \ 490326943Sdim offsetof(struct CLASS, MEMBER)) 491326943Sdim 492326943Sdim#endif // SANITIZER_SOLARIS 493326943Sdim 494326943Sdim#endif 495