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