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