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