1*ee754c2dSkamil //===-- sanitizer_platform_limits_openbsd.h -------------------------------===// 2*ee754c2dSkamil // 3*ee754c2dSkamil // The LLVM Compiler Infrastructure 4*ee754c2dSkamil // 5*ee754c2dSkamil // This file is distributed under the University of Illinois Open Source 6*ee754c2dSkamil // License. See LICENSE.TXT for details. 7*ee754c2dSkamil // 8*ee754c2dSkamil //===----------------------------------------------------------------------===// 9*ee754c2dSkamil // 10*ee754c2dSkamil // This file is a part of Sanitizer common code. 11*ee754c2dSkamil // 12*ee754c2dSkamil // Sizes and layouts of platform-specific OpenBSD data structures. 13*ee754c2dSkamil //===----------------------------------------------------------------------===// 14*ee754c2dSkamil 15*ee754c2dSkamil #ifndef SANITIZER_PLATFORM_LIMITS_OPENBSD_H 16*ee754c2dSkamil #define SANITIZER_PLATFORM_LIMITS_OPENBSD_H 17*ee754c2dSkamil 18*ee754c2dSkamil #if SANITIZER_OPENBSD 19*ee754c2dSkamil 20*ee754c2dSkamil #include "sanitizer_internal_defs.h" 21*ee754c2dSkamil #include "sanitizer_platform.h" 22*ee754c2dSkamil 23*ee754c2dSkamil #define _GET_LINK_MAP_BY_DLOPEN_HANDLE(handle, shift) \ 24*ee754c2dSkamil ((link_map *)((handle) == nullptr ? nullptr : ((char *)(handle) + (shift)))) 25*ee754c2dSkamil 26*ee754c2dSkamil #if defined(__x86_64__) 27*ee754c2dSkamil #define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) \ 28*ee754c2dSkamil _GET_LINK_MAP_BY_DLOPEN_HANDLE(handle, 312) 29*ee754c2dSkamil #elif defined(__i386__) 30*ee754c2dSkamil #define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) \ 31*ee754c2dSkamil _GET_LINK_MAP_BY_DLOPEN_HANDLE(handle, 164) 32*ee754c2dSkamil #endif 33*ee754c2dSkamil 34*ee754c2dSkamil #define RLIMIT_AS RLIMIT_DATA 35*ee754c2dSkamil 36*ee754c2dSkamil namespace __sanitizer { 37*ee754c2dSkamil extern unsigned struct_utsname_sz; 38*ee754c2dSkamil extern unsigned struct_stat_sz; 39*ee754c2dSkamil extern unsigned struct_rusage_sz; 40*ee754c2dSkamil extern unsigned siginfo_t_sz; 41*ee754c2dSkamil extern unsigned struct_itimerval_sz; 42*ee754c2dSkamil extern unsigned pthread_t_sz; 43*ee754c2dSkamil extern unsigned pthread_mutex_t_sz; 44*ee754c2dSkamil extern unsigned pthread_cond_t_sz; 45*ee754c2dSkamil extern unsigned pid_t_sz; 46*ee754c2dSkamil extern unsigned timeval_sz; 47*ee754c2dSkamil extern unsigned uid_t_sz; 48*ee754c2dSkamil extern unsigned gid_t_sz; 49*ee754c2dSkamil extern unsigned mbstate_t_sz; 50*ee754c2dSkamil extern unsigned struct_timezone_sz; 51*ee754c2dSkamil extern unsigned struct_tms_sz; 52*ee754c2dSkamil extern unsigned struct_itimerspec_sz; 53*ee754c2dSkamil extern unsigned struct_sigevent_sz; 54*ee754c2dSkamil extern unsigned struct_statfs_sz; 55*ee754c2dSkamil extern unsigned struct_sockaddr_sz; 56*ee754c2dSkamil 57*ee754c2dSkamil extern unsigned struct_rlimit_sz; 58*ee754c2dSkamil extern unsigned struct_utimbuf_sz; 59*ee754c2dSkamil extern unsigned struct_timespec_sz; 60*ee754c2dSkamil 61*ee754c2dSkamil struct __sanitizer_iocb { 62*ee754c2dSkamil u64 aio_offset; 63*ee754c2dSkamil uptr aio_buf; 64*ee754c2dSkamil long aio_nbytes; 65*ee754c2dSkamil u32 aio_fildes; 66*ee754c2dSkamil u32 aio_lio_opcode; 67*ee754c2dSkamil long aio_reqprio; 68*ee754c2dSkamil #if SANITIZER_WORDSIZE == 64 69*ee754c2dSkamil u8 aio_sigevent[32]; 70*ee754c2dSkamil #else 71*ee754c2dSkamil u8 aio_sigevent[20]; 72*ee754c2dSkamil #endif 73*ee754c2dSkamil u32 _state; 74*ee754c2dSkamil u32 _errno; 75*ee754c2dSkamil long _retval; 76*ee754c2dSkamil }; 77*ee754c2dSkamil 78*ee754c2dSkamil struct __sanitizer___sysctl_args { 79*ee754c2dSkamil int *name; 80*ee754c2dSkamil int nlen; 81*ee754c2dSkamil void *oldval; 82*ee754c2dSkamil uptr *oldlenp; 83*ee754c2dSkamil void *newval; 84*ee754c2dSkamil uptr newlen; 85*ee754c2dSkamil }; 86*ee754c2dSkamil 87*ee754c2dSkamil struct __sanitizer_sem_t { 88*ee754c2dSkamil uptr data[5]; 89*ee754c2dSkamil }; 90*ee754c2dSkamil 91*ee754c2dSkamil struct __sanitizer_ipc_perm { 92*ee754c2dSkamil u32 cuid; 93*ee754c2dSkamil u32 cgid; 94*ee754c2dSkamil u32 uid; 95*ee754c2dSkamil u32 gid; 96*ee754c2dSkamil u32 mode; 97*ee754c2dSkamil unsigned short seq; 98*ee754c2dSkamil long key; 99*ee754c2dSkamil }; 100*ee754c2dSkamil 101*ee754c2dSkamil struct __sanitizer_shmid_ds { 102*ee754c2dSkamil __sanitizer_ipc_perm shm_perm; 103*ee754c2dSkamil int shm_segsz; 104*ee754c2dSkamil u32 shm_lpid; 105*ee754c2dSkamil u32 shm_cpid; 106*ee754c2dSkamil short shm_nattch; 107*ee754c2dSkamil u64 shm_atime; 108*ee754c2dSkamil long __shm_atimensec; 109*ee754c2dSkamil u64 shm_dtime; 110*ee754c2dSkamil long __shm_dtimensec; 111*ee754c2dSkamil u64 shm_ctime; 112*ee754c2dSkamil long __shm_ctimensec; 113*ee754c2dSkamil void *_shm_internal; 114*ee754c2dSkamil }; 115*ee754c2dSkamil 116*ee754c2dSkamil extern unsigned struct_msqid_ds_sz; 117*ee754c2dSkamil extern unsigned struct_mq_attr_sz; 118*ee754c2dSkamil extern unsigned struct_timex_sz; 119*ee754c2dSkamil extern unsigned struct_statvfs_sz; 120*ee754c2dSkamil 121*ee754c2dSkamil struct __sanitizer_iovec { 122*ee754c2dSkamil void *iov_base; 123*ee754c2dSkamil uptr iov_len; 124*ee754c2dSkamil }; 125*ee754c2dSkamil 126*ee754c2dSkamil struct __sanitizer_ifaddrs { 127*ee754c2dSkamil struct __sanitizer_ifaddrs *ifa_next; 128*ee754c2dSkamil char *ifa_name; 129*ee754c2dSkamil unsigned int ifa_flags; 130*ee754c2dSkamil struct __sanitizer_sockaddr *ifa_addr; // (struct sockaddr *) 131*ee754c2dSkamil struct __sanitizer_sockaddr *ifa_netmask; // (struct sockaddr *) 132*ee754c2dSkamil struct __sanitizer_sockaddr *ifa_dstaddr; // (struct sockaddr *) 133*ee754c2dSkamil void *ifa_data; 134*ee754c2dSkamil }; 135*ee754c2dSkamil 136*ee754c2dSkamil typedef unsigned __sanitizer_pthread_key_t; 137*ee754c2dSkamil 138*ee754c2dSkamil typedef long long __sanitizer_time_t; 139*ee754c2dSkamil typedef int __sanitizer_suseconds_t; 140*ee754c2dSkamil 141*ee754c2dSkamil struct __sanitizer_timeval { 142*ee754c2dSkamil __sanitizer_time_t tv_sec; 143*ee754c2dSkamil __sanitizer_suseconds_t tv_usec; 144*ee754c2dSkamil }; 145*ee754c2dSkamil 146*ee754c2dSkamil struct __sanitizer_itimerval { 147*ee754c2dSkamil struct __sanitizer_timeval it_interval; 148*ee754c2dSkamil struct __sanitizer_timeval it_value; 149*ee754c2dSkamil }; 150*ee754c2dSkamil 151*ee754c2dSkamil struct __sanitizer_passwd { 152*ee754c2dSkamil char *pw_name; 153*ee754c2dSkamil char *pw_passwd; 154*ee754c2dSkamil int pw_uid; 155*ee754c2dSkamil int pw_gid; 156*ee754c2dSkamil __sanitizer_time_t pw_change; 157*ee754c2dSkamil char *pw_class; 158*ee754c2dSkamil char *pw_gecos; 159*ee754c2dSkamil char *pw_dir; 160*ee754c2dSkamil char *pw_shell; 161*ee754c2dSkamil __sanitizer_time_t pw_expire; 162*ee754c2dSkamil }; 163*ee754c2dSkamil 164*ee754c2dSkamil struct __sanitizer_group { 165*ee754c2dSkamil char *gr_name; 166*ee754c2dSkamil char *gr_passwd; 167*ee754c2dSkamil int gr_gid; 168*ee754c2dSkamil char **gr_mem; 169*ee754c2dSkamil }; 170*ee754c2dSkamil 171*ee754c2dSkamil struct __sanitizer_ether_addr { 172*ee754c2dSkamil u8 octet[6]; 173*ee754c2dSkamil }; 174*ee754c2dSkamil 175*ee754c2dSkamil struct __sanitizer_tm { 176*ee754c2dSkamil int tm_sec; 177*ee754c2dSkamil int tm_min; 178*ee754c2dSkamil int tm_hour; 179*ee754c2dSkamil int tm_mday; 180*ee754c2dSkamil int tm_mon; 181*ee754c2dSkamil int tm_year; 182*ee754c2dSkamil int tm_wday; 183*ee754c2dSkamil int tm_yday; 184*ee754c2dSkamil int tm_isdst; 185*ee754c2dSkamil long int tm_gmtoff; 186*ee754c2dSkamil const char *tm_zone; 187*ee754c2dSkamil }; 188*ee754c2dSkamil 189*ee754c2dSkamil struct __sanitizer_msghdr { 190*ee754c2dSkamil void *msg_name; 191*ee754c2dSkamil unsigned msg_namelen; 192*ee754c2dSkamil struct __sanitizer_iovec *msg_iov; 193*ee754c2dSkamil unsigned msg_iovlen; 194*ee754c2dSkamil void *msg_control; 195*ee754c2dSkamil unsigned msg_controllen; 196*ee754c2dSkamil int msg_flags; 197*ee754c2dSkamil }; 198*ee754c2dSkamil struct __sanitizer_cmsghdr { 199*ee754c2dSkamil unsigned cmsg_len; 200*ee754c2dSkamil int cmsg_level; 201*ee754c2dSkamil int cmsg_type; 202*ee754c2dSkamil }; 203*ee754c2dSkamil 204*ee754c2dSkamil struct __sanitizer_dirent { 205*ee754c2dSkamil u64 d_fileno; 206*ee754c2dSkamil u64 d_off; 207*ee754c2dSkamil u16 d_reclen; 208*ee754c2dSkamil }; 209*ee754c2dSkamil 210*ee754c2dSkamil typedef u64 __sanitizer_clock_t; 211*ee754c2dSkamil typedef u32 __sanitizer_clockid_t; 212*ee754c2dSkamil 213*ee754c2dSkamil typedef u32 __sanitizer___kernel_uid_t; 214*ee754c2dSkamil typedef u32 __sanitizer___kernel_gid_t; 215*ee754c2dSkamil typedef u64 __sanitizer___kernel_off_t; 216*ee754c2dSkamil typedef struct { 217*ee754c2dSkamil u32 fds_bits[8]; 218*ee754c2dSkamil } __sanitizer___kernel_fd_set; 219*ee754c2dSkamil 220*ee754c2dSkamil typedef struct { 221*ee754c2dSkamil unsigned int pta_magic; 222*ee754c2dSkamil int pta_flags; 223*ee754c2dSkamil void *pta_private; 224*ee754c2dSkamil } __sanitizer_pthread_attr_t; 225*ee754c2dSkamil 226*ee754c2dSkamil typedef unsigned int __sanitizer_sigset_t; 227*ee754c2dSkamil 228*ee754c2dSkamil struct __sanitizer_siginfo { 229*ee754c2dSkamil // The size is determined by looking at sizeof of real siginfo_t on linux. 230*ee754c2dSkamil u64 opaque[128 / sizeof(u64)]; 231*ee754c2dSkamil }; 232*ee754c2dSkamil 233*ee754c2dSkamil using __sanitizer_sighandler_ptr = void (*)(int sig); 234*ee754c2dSkamil using __sanitizer_sigactionhandler_ptr = void (*)(int sig, 235*ee754c2dSkamil __sanitizer_siginfo *siginfo, 236*ee754c2dSkamil void *uctx); 237*ee754c2dSkamil 238*ee754c2dSkamil struct __sanitizer_sigaction { 239*ee754c2dSkamil union { 240*ee754c2dSkamil __sanitizer_sighandler_ptr handler; 241*ee754c2dSkamil __sanitizer_sigactionhandler_ptr sigaction; 242*ee754c2dSkamil }; 243*ee754c2dSkamil __sanitizer_sigset_t sa_mask; 244*ee754c2dSkamil int sa_flags; 245*ee754c2dSkamil }; 246*ee754c2dSkamil 247*ee754c2dSkamil typedef __sanitizer_sigset_t __sanitizer_kernel_sigset_t; 248*ee754c2dSkamil 249*ee754c2dSkamil struct __sanitizer_kernel_sigaction_t { 250*ee754c2dSkamil union { 251*ee754c2dSkamil void (*handler)(int signo); 252*ee754c2dSkamil void (*sigaction)(int signo, void *info, void *ctx); 253*ee754c2dSkamil }; 254*ee754c2dSkamil unsigned long sa_flags; 255*ee754c2dSkamil void (*sa_restorer)(void); 256*ee754c2dSkamil __sanitizer_kernel_sigset_t sa_mask; 257*ee754c2dSkamil }; 258*ee754c2dSkamil 259*ee754c2dSkamil extern const uptr sig_ign; 260*ee754c2dSkamil extern const uptr sig_dfl; 261*ee754c2dSkamil extern const uptr sig_err; 262*ee754c2dSkamil extern const uptr sa_siginfo; 263*ee754c2dSkamil 264*ee754c2dSkamil extern int af_inet; 265*ee754c2dSkamil extern int af_inet6; 266*ee754c2dSkamil uptr __sanitizer_in_addr_sz(int af); 267*ee754c2dSkamil 268*ee754c2dSkamil struct __sanitizer_dl_phdr_info { 269*ee754c2dSkamil #if SANITIZER_WORDSIZE == 64 270*ee754c2dSkamil u64 dlpi_addr; 271*ee754c2dSkamil #else 272*ee754c2dSkamil u32 dlpi_addr; 273*ee754c2dSkamil #endif 274*ee754c2dSkamil const char *dlpi_name; 275*ee754c2dSkamil const void *dlpi_phdr; 276*ee754c2dSkamil #if SANITIZER_WORDSIZE == 64 277*ee754c2dSkamil u32 dlpi_phnum; 278*ee754c2dSkamil #else 279*ee754c2dSkamil u16 dlpi_phnum; 280*ee754c2dSkamil #endif 281*ee754c2dSkamil }; 282*ee754c2dSkamil 283*ee754c2dSkamil extern unsigned struct_ElfW_Phdr_sz; 284*ee754c2dSkamil 285*ee754c2dSkamil struct __sanitizer_addrinfo { 286*ee754c2dSkamil int ai_flags; 287*ee754c2dSkamil int ai_family; 288*ee754c2dSkamil int ai_socktype; 289*ee754c2dSkamil int ai_protocol; 290*ee754c2dSkamil unsigned ai_addrlen; 291*ee754c2dSkamil struct __sanitizer_sockaddr *ai_addr; 292*ee754c2dSkamil char *ai_canonname; 293*ee754c2dSkamil struct __sanitizer_addrinfo *ai_next; 294*ee754c2dSkamil }; 295*ee754c2dSkamil 296*ee754c2dSkamil struct __sanitizer_hostent { 297*ee754c2dSkamil char *h_name; 298*ee754c2dSkamil char **h_aliases; 299*ee754c2dSkamil int h_addrtype; 300*ee754c2dSkamil int h_length; 301*ee754c2dSkamil char **h_addr_list; 302*ee754c2dSkamil }; 303*ee754c2dSkamil 304*ee754c2dSkamil struct __sanitizer_pollfd { 305*ee754c2dSkamil int fd; 306*ee754c2dSkamil short events; 307*ee754c2dSkamil short revents; 308*ee754c2dSkamil }; 309*ee754c2dSkamil 310*ee754c2dSkamil typedef unsigned __sanitizer_nfds_t; 311*ee754c2dSkamil 312*ee754c2dSkamil struct __sanitizer_glob_t { 313*ee754c2dSkamil int gl_pathc; 314*ee754c2dSkamil int gl_matchc; 315*ee754c2dSkamil int gl_offs; 316*ee754c2dSkamil int gl_flags; 317*ee754c2dSkamil char **gl_pathv; 318*ee754c2dSkamil void **gl_statv; 319*ee754c2dSkamil int (*gl_errfunc)(const char *, int); 320*ee754c2dSkamil void (*gl_closedir)(void *dirp); 321*ee754c2dSkamil struct dirent *(*gl_readdir)(void *dirp); 322*ee754c2dSkamil void *(*gl_opendir)(const char *); 323*ee754c2dSkamil int (*gl_lstat)(const char *, void * /* struct stat* */); 324*ee754c2dSkamil int (*gl_stat)(const char *, void * /* struct stat* */); 325*ee754c2dSkamil }; 326*ee754c2dSkamil 327*ee754c2dSkamil extern int glob_nomatch; 328*ee754c2dSkamil extern int glob_altdirfunc; 329*ee754c2dSkamil 330*ee754c2dSkamil extern unsigned path_max; 331*ee754c2dSkamil 332*ee754c2dSkamil typedef char __sanitizer_FILE; 333*ee754c2dSkamil #define SANITIZER_HAS_STRUCT_FILE 0 334*ee754c2dSkamil 335*ee754c2dSkamil extern int shmctl_ipc_stat; 336*ee754c2dSkamil 337*ee754c2dSkamil // This simplifies generic code 338*ee754c2dSkamil #define struct_shminfo_sz -1 339*ee754c2dSkamil #define struct_shm_info_sz -1 340*ee754c2dSkamil #define shmctl_shm_stat -1 341*ee754c2dSkamil #define shmctl_ipc_info -1 342*ee754c2dSkamil #define shmctl_shm_info -1 343*ee754c2dSkamil 344*ee754c2dSkamil extern unsigned struct_utmp_sz; 345*ee754c2dSkamil extern unsigned struct_utmpx_sz; 346*ee754c2dSkamil 347*ee754c2dSkamil extern int map_fixed; 348*ee754c2dSkamil 349*ee754c2dSkamil // ioctl arguments 350*ee754c2dSkamil struct __sanitizer_ifconf { 351*ee754c2dSkamil int ifc_len; 352*ee754c2dSkamil union { 353*ee754c2dSkamil void *ifcu_req; 354*ee754c2dSkamil } ifc_ifcu; 355*ee754c2dSkamil }; 356*ee754c2dSkamil 357*ee754c2dSkamil extern const int si_SEGV_MAPERR; 358*ee754c2dSkamil extern const int si_SEGV_ACCERR; 359*ee754c2dSkamil } // namespace __sanitizer 360*ee754c2dSkamil 361*ee754c2dSkamil #define CHECK_TYPE_SIZE(TYPE) \ 362*ee754c2dSkamil COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE)) 363*ee754c2dSkamil 364*ee754c2dSkamil #define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \ 365*ee754c2dSkamil COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *)NULL)->MEMBER) == \ 366*ee754c2dSkamil sizeof(((CLASS *)NULL)->MEMBER)); \ 367*ee754c2dSkamil COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \ 368*ee754c2dSkamil offsetof(CLASS, MEMBER)) 369*ee754c2dSkamil 370*ee754c2dSkamil // For sigaction, which is a function and struct at the same time, 371*ee754c2dSkamil // and thus requires explicit "struct" in sizeof() expression. 372*ee754c2dSkamil #define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \ 373*ee754c2dSkamil COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *)NULL)->MEMBER) == \ 374*ee754c2dSkamil sizeof(((struct CLASS *)NULL)->MEMBER)); \ 375*ee754c2dSkamil COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \ 376*ee754c2dSkamil offsetof(struct CLASS, MEMBER)) 377*ee754c2dSkamil 378*ee754c2dSkamil #define SIGACTION_SYMNAME __sigaction14 379*ee754c2dSkamil 380*ee754c2dSkamil #endif // SANITIZER_OPENBSD 381*ee754c2dSkamil 382*ee754c2dSkamil #endif 383