sanitizer_platform_limits_freebsd.cpp revision 1.3
1//===-- sanitizer_platform_limits_freebsd.cpp -----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of Sanitizer common code.
10//
11// Sizes and layouts of platform-specific FreeBSD data structures.
12//===----------------------------------------------------------------------===//
13
14#include "sanitizer_platform.h"
15
16#if SANITIZER_FREEBSD
17
18#include <sys/capsicum.h>
19#include <sys/consio.h>
20#include <sys/filio.h>
21#include <sys/ipc.h>
22#include <sys/kbio.h>
23#include <sys/link_elf.h>
24#include <sys/mman.h>
25#include <sys/mount.h>
26#include <sys/mqueue.h>
27#include <sys/msg.h>
28#include <sys/mtio.h>
29#include <sys/ptrace.h>
30#include <sys/resource.h>
31#include <sys/signal.h>
32#include <sys/socket.h>
33#include <sys/sockio.h>
34#include <sys/soundcard.h>
35#include <sys/stat.h>
36#include <sys/statvfs.h>
37#include <sys/time.h>
38#pragma clang diagnostic push
39#pragma clang diagnostic ignored "-W#warnings"
40#include <sys/timeb.h>
41#pragma clang diagnostic pop
42#include <sys/times.h>
43#include <sys/timespec.h>
44#include <sys/types.h>
45#include <sys/ucontext.h>
46#include <sys/utsname.h>
47//
48#include <arpa/inet.h>
49#include <net/ethernet.h>
50#include <net/if.h>
51#include <net/ppp_defs.h>
52#include <net/route.h>
53#include <netdb.h>
54#include <netinet/in.h>
55#include <netinet/ip_mroute.h>
56//
57#include <dirent.h>
58#include <dlfcn.h>
59#include <fstab.h>
60#include <fts.h>
61#include <glob.h>
62#include <grp.h>
63#include <ifaddrs.h>
64#include <limits.h>
65#include <poll.h>
66#include <pthread.h>
67#include <pwd.h>
68#include <regex.h>
69#include <semaphore.h>
70#include <signal.h>
71#include <stddef.h>
72#include <md5.h>
73#include <sha224.h>
74#include <sha256.h>
75#include <sha384.h>
76#include <sha512.h>
77#include <stdio.h>
78#include <stringlist.h>
79#include <term.h>
80#include <termios.h>
81#include <time.h>
82#include <ttyent.h>
83#include <utime.h>
84#include <utmpx.h>
85#include <vis.h>
86#include <wchar.h>
87#include <wordexp.h>
88
89#define _KERNEL  // to declare 'shminfo' structure
90#include <sys/shm.h>
91#undef _KERNEL
92
93#undef IOC_DIRMASK
94
95// Include these after system headers to avoid name clashes and ambiguities.
96#include "sanitizer_internal_defs.h"
97#include "sanitizer_libc.h"
98#include "sanitizer_platform_limits_freebsd.h"
99
100namespace __sanitizer {
101void *__sanitizer_get_link_map_by_dlopen_handle(void *handle) {
102  void *p = nullptr;
103  return internal_dlinfo(handle, RTLD_DI_LINKMAP, &p) == 0 ? p : nullptr;
104}
105
106unsigned struct_cap_rights_sz = sizeof(cap_rights_t);
107unsigned struct_utsname_sz = sizeof(struct utsname);
108unsigned struct_stat_sz = sizeof(struct stat);
109unsigned struct_rusage_sz = sizeof(struct rusage);
110unsigned struct_tm_sz = sizeof(struct tm);
111unsigned struct_passwd_sz = sizeof(struct passwd);
112unsigned struct_group_sz = sizeof(struct group);
113unsigned siginfo_t_sz = sizeof(siginfo_t);
114unsigned struct_sigaction_sz = sizeof(struct sigaction);
115unsigned struct_stack_t_sz = sizeof(stack_t);
116unsigned struct_itimerval_sz = sizeof(struct itimerval);
117unsigned pthread_t_sz = sizeof(pthread_t);
118unsigned pthread_mutex_t_sz = sizeof(pthread_mutex_t);
119unsigned pthread_cond_t_sz = sizeof(pthread_cond_t);
120unsigned pid_t_sz = sizeof(pid_t);
121unsigned timeval_sz = sizeof(timeval);
122unsigned uid_t_sz = sizeof(uid_t);
123unsigned gid_t_sz = sizeof(gid_t);
124unsigned fpos_t_sz = sizeof(fpos_t);
125unsigned mbstate_t_sz = sizeof(mbstate_t);
126unsigned sigset_t_sz = sizeof(sigset_t);
127unsigned struct_timezone_sz = sizeof(struct timezone);
128unsigned struct_tms_sz = sizeof(struct tms);
129unsigned struct_sigevent_sz = sizeof(struct sigevent);
130unsigned struct_sched_param_sz = sizeof(struct sched_param);
131unsigned struct_statfs_sz = sizeof(struct statfs);
132unsigned struct_sockaddr_sz = sizeof(struct sockaddr);
133unsigned ucontext_t_sz = sizeof(ucontext_t);
134unsigned struct_rlimit_sz = sizeof(struct rlimit);
135unsigned struct_timespec_sz = sizeof(struct timespec);
136unsigned struct_utimbuf_sz = sizeof(struct utimbuf);
137unsigned struct_itimerspec_sz = sizeof(struct itimerspec);
138unsigned struct_timeb_sz = sizeof(struct timeb);
139unsigned struct_msqid_ds_sz = sizeof(struct msqid_ds);
140unsigned struct_mq_attr_sz = sizeof(struct mq_attr);
141unsigned struct_statvfs_sz = sizeof(struct statvfs);
142unsigned struct_shminfo_sz = sizeof(struct shminfo);
143unsigned struct_shm_info_sz = sizeof(struct shm_info);
144unsigned struct_regmatch_sz = sizeof(regmatch_t);
145unsigned struct_regex_sz = sizeof(regex_t);
146unsigned struct_fstab_sz = sizeof(struct fstab);
147unsigned struct_FTS_sz = sizeof(FTS);
148unsigned struct_FTSENT_sz = sizeof(FTSENT);
149unsigned struct_StringList_sz = sizeof(StringList);
150
151const uptr sig_ign = (uptr)SIG_IGN;
152const uptr sig_dfl = (uptr)SIG_DFL;
153const uptr sig_err = (uptr)SIG_ERR;
154const uptr sa_siginfo = (uptr)SA_SIGINFO;
155
156int shmctl_ipc_stat = (int)IPC_STAT;
157int shmctl_ipc_info = (int)IPC_INFO;
158int shmctl_shm_info = (int)SHM_INFO;
159int shmctl_shm_stat = (int)SHM_STAT;
160unsigned struct_utmpx_sz = sizeof(struct utmpx);
161
162int map_fixed = MAP_FIXED;
163
164int af_inet = (int)AF_INET;
165int af_inet6 = (int)AF_INET6;
166
167uptr __sanitizer_in_addr_sz(int af) {
168  if (af == AF_INET)
169    return sizeof(struct in_addr);
170  else if (af == AF_INET6)
171    return sizeof(struct in6_addr);
172  else
173    return 0;
174}
175
176unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
177int glob_nomatch = GLOB_NOMATCH;
178int glob_altdirfunc = GLOB_ALTDIRFUNC;
179const int wordexp_wrde_dooffs = WRDE_DOOFFS;
180
181unsigned path_max = PATH_MAX;
182
183int struct_ttyent_sz = sizeof(struct ttyent);
184
185// ioctl arguments
186unsigned struct_ifreq_sz = sizeof(struct ifreq);
187unsigned struct_termios_sz = sizeof(struct termios);
188unsigned struct_winsize_sz = sizeof(struct winsize);
189#if SOUND_VERSION >= 0x040000
190unsigned struct_copr_buffer_sz = 0;
191unsigned struct_copr_debug_buf_sz = 0;
192unsigned struct_copr_msg_sz = 0;
193#else
194unsigned struct_copr_buffer_sz = sizeof(struct copr_buffer);
195unsigned struct_copr_debug_buf_sz = sizeof(struct copr_debug_buf);
196unsigned struct_copr_msg_sz = sizeof(struct copr_msg);
197#endif
198unsigned struct_midi_info_sz = sizeof(struct midi_info);
199unsigned struct_mtget_sz = sizeof(struct mtget);
200unsigned struct_mtop_sz = sizeof(struct mtop);
201unsigned struct_sbi_instrument_sz = sizeof(struct sbi_instrument);
202unsigned struct_seq_event_rec_sz = sizeof(struct seq_event_rec);
203unsigned struct_synth_info_sz = sizeof(struct synth_info);
204unsigned struct_audio_buf_info_sz = sizeof(struct audio_buf_info);
205unsigned struct_ppp_stats_sz = sizeof(struct ppp_stats);
206unsigned struct_sioc_sg_req_sz = sizeof(struct sioc_sg_req);
207unsigned struct_sioc_vif_req_sz = sizeof(struct sioc_vif_req);
208const unsigned long __sanitizer_bufsiz = BUFSIZ;
209
210const unsigned IOCTL_NOT_PRESENT = 0;
211
212unsigned IOCTL_FIOASYNC = FIOASYNC;
213unsigned IOCTL_FIOCLEX = FIOCLEX;
214unsigned IOCTL_FIOGETOWN = FIOGETOWN;
215unsigned IOCTL_FIONBIO = FIONBIO;
216unsigned IOCTL_FIONCLEX = FIONCLEX;
217unsigned IOCTL_FIOSETOWN = FIOSETOWN;
218unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
219unsigned IOCTL_SIOCATMARK = SIOCATMARK;
220unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;
221unsigned IOCTL_SIOCGIFADDR = SIOCGIFADDR;
222unsigned IOCTL_SIOCGIFBRDADDR = SIOCGIFBRDADDR;
223unsigned IOCTL_SIOCGIFCONF = SIOCGIFCONF;
224unsigned IOCTL_SIOCGIFDSTADDR = SIOCGIFDSTADDR;
225unsigned IOCTL_SIOCGIFFLAGS = SIOCGIFFLAGS;
226unsigned IOCTL_SIOCGIFMETRIC = SIOCGIFMETRIC;
227unsigned IOCTL_SIOCGIFMTU = SIOCGIFMTU;
228unsigned IOCTL_SIOCGIFNETMASK = SIOCGIFNETMASK;
229unsigned IOCTL_SIOCGPGRP = SIOCGPGRP;
230unsigned IOCTL_SIOCSIFADDR = SIOCSIFADDR;
231unsigned IOCTL_SIOCSIFBRDADDR = SIOCSIFBRDADDR;
232unsigned IOCTL_SIOCSIFDSTADDR = SIOCSIFDSTADDR;
233unsigned IOCTL_SIOCSIFFLAGS = SIOCSIFFLAGS;
234unsigned IOCTL_SIOCSIFMETRIC = SIOCSIFMETRIC;
235unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;
236unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
237unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
238unsigned IOCTL_TIOCCONS = TIOCCONS;
239unsigned IOCTL_TIOCEXCL = TIOCEXCL;
240unsigned IOCTL_TIOCGETD = TIOCGETD;
241unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
242unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
243unsigned IOCTL_TIOCMBIC = TIOCMBIC;
244unsigned IOCTL_TIOCMBIS = TIOCMBIS;
245unsigned IOCTL_TIOCMGET = TIOCMGET;
246unsigned IOCTL_TIOCMSET = TIOCMSET;
247unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
248unsigned IOCTL_TIOCNXCL = TIOCNXCL;
249unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;
250unsigned IOCTL_TIOCPKT = TIOCPKT;
251unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;
252unsigned IOCTL_TIOCSETD = TIOCSETD;
253unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
254unsigned IOCTL_TIOCSTI = TIOCSTI;
255unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
256unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
257unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
258unsigned IOCTL_MTIOCGET = MTIOCGET;
259unsigned IOCTL_MTIOCTOP = MTIOCTOP;
260unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE = SNDCTL_DSP_GETBLKSIZE;
261unsigned IOCTL_SNDCTL_DSP_GETFMTS = SNDCTL_DSP_GETFMTS;
262unsigned IOCTL_SNDCTL_DSP_NONBLOCK = SNDCTL_DSP_NONBLOCK;
263unsigned IOCTL_SNDCTL_DSP_POST = SNDCTL_DSP_POST;
264unsigned IOCTL_SNDCTL_DSP_RESET = SNDCTL_DSP_RESET;
265unsigned IOCTL_SNDCTL_DSP_SETFMT = SNDCTL_DSP_SETFMT;
266unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT = SNDCTL_DSP_SETFRAGMENT;
267unsigned IOCTL_SNDCTL_DSP_SPEED = SNDCTL_DSP_SPEED;
268unsigned IOCTL_SNDCTL_DSP_STEREO = SNDCTL_DSP_STEREO;
269unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE = SNDCTL_DSP_SUBDIVIDE;
270unsigned IOCTL_SNDCTL_DSP_SYNC = SNDCTL_DSP_SYNC;
271unsigned IOCTL_SNDCTL_FM_4OP_ENABLE = SNDCTL_FM_4OP_ENABLE;
272unsigned IOCTL_SNDCTL_FM_LOAD_INSTR = SNDCTL_FM_LOAD_INSTR;
273unsigned IOCTL_SNDCTL_MIDI_INFO = SNDCTL_MIDI_INFO;
274unsigned IOCTL_SNDCTL_MIDI_PRETIME = SNDCTL_MIDI_PRETIME;
275unsigned IOCTL_SNDCTL_SEQ_CTRLRATE = SNDCTL_SEQ_CTRLRATE;
276unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT = SNDCTL_SEQ_GETINCOUNT;
277unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT = SNDCTL_SEQ_GETOUTCOUNT;
278unsigned IOCTL_SNDCTL_SEQ_NRMIDIS = SNDCTL_SEQ_NRMIDIS;
279unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS = SNDCTL_SEQ_NRSYNTHS;
280unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND = SNDCTL_SEQ_OUTOFBAND;
281unsigned IOCTL_SNDCTL_SEQ_PANIC = SNDCTL_SEQ_PANIC;
282unsigned IOCTL_SNDCTL_SEQ_PERCMODE = SNDCTL_SEQ_PERCMODE;
283unsigned IOCTL_SNDCTL_SEQ_RESET = SNDCTL_SEQ_RESET;
284unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES = SNDCTL_SEQ_RESETSAMPLES;
285unsigned IOCTL_SNDCTL_SEQ_SYNC = SNDCTL_SEQ_SYNC;
286unsigned IOCTL_SNDCTL_SEQ_TESTMIDI = SNDCTL_SEQ_TESTMIDI;
287unsigned IOCTL_SNDCTL_SEQ_THRESHOLD = SNDCTL_SEQ_THRESHOLD;
288unsigned IOCTL_SNDCTL_SYNTH_INFO = SNDCTL_SYNTH_INFO;
289unsigned IOCTL_SNDCTL_SYNTH_MEMAVL = SNDCTL_SYNTH_MEMAVL;
290unsigned IOCTL_SNDCTL_TMR_CONTINUE = SNDCTL_TMR_CONTINUE;
291unsigned IOCTL_SNDCTL_TMR_METRONOME = SNDCTL_TMR_METRONOME;
292unsigned IOCTL_SNDCTL_TMR_SELECT = SNDCTL_TMR_SELECT;
293unsigned IOCTL_SNDCTL_TMR_SOURCE = SNDCTL_TMR_SOURCE;
294unsigned IOCTL_SNDCTL_TMR_START = SNDCTL_TMR_START;
295unsigned IOCTL_SNDCTL_TMR_STOP = SNDCTL_TMR_STOP;
296unsigned IOCTL_SNDCTL_TMR_TEMPO = SNDCTL_TMR_TEMPO;
297unsigned IOCTL_SNDCTL_TMR_TIMEBASE = SNDCTL_TMR_TIMEBASE;
298unsigned IOCTL_SOUND_MIXER_READ_ALTPCM = SOUND_MIXER_READ_ALTPCM;
299unsigned IOCTL_SOUND_MIXER_READ_BASS = SOUND_MIXER_READ_BASS;
300unsigned IOCTL_SOUND_MIXER_READ_CAPS = SOUND_MIXER_READ_CAPS;
301unsigned IOCTL_SOUND_MIXER_READ_CD = SOUND_MIXER_READ_CD;
302unsigned IOCTL_SOUND_MIXER_READ_DEVMASK = SOUND_MIXER_READ_DEVMASK;
303unsigned IOCTL_SOUND_MIXER_READ_ENHANCE = SOUND_MIXER_READ_ENHANCE;
304unsigned IOCTL_SOUND_MIXER_READ_IGAIN = SOUND_MIXER_READ_IGAIN;
305unsigned IOCTL_SOUND_MIXER_READ_IMIX = SOUND_MIXER_READ_IMIX;
306unsigned IOCTL_SOUND_MIXER_READ_LINE = SOUND_MIXER_READ_LINE;
307unsigned IOCTL_SOUND_MIXER_READ_LINE1 = SOUND_MIXER_READ_LINE1;
308unsigned IOCTL_SOUND_MIXER_READ_LINE2 = SOUND_MIXER_READ_LINE2;
309unsigned IOCTL_SOUND_MIXER_READ_LINE3 = SOUND_MIXER_READ_LINE3;
310unsigned IOCTL_SOUND_MIXER_READ_LOUD = SOUND_MIXER_READ_LOUD;
311unsigned IOCTL_SOUND_MIXER_READ_MIC = SOUND_MIXER_READ_MIC;
312unsigned IOCTL_SOUND_MIXER_READ_MUTE = SOUND_MIXER_READ_MUTE;
313unsigned IOCTL_SOUND_MIXER_READ_OGAIN = SOUND_MIXER_READ_OGAIN;
314unsigned IOCTL_SOUND_MIXER_READ_PCM = SOUND_MIXER_READ_PCM;
315unsigned IOCTL_SOUND_MIXER_READ_RECLEV = SOUND_MIXER_READ_RECLEV;
316unsigned IOCTL_SOUND_MIXER_READ_RECMASK = SOUND_MIXER_READ_RECMASK;
317unsigned IOCTL_SOUND_MIXER_READ_RECSRC = SOUND_MIXER_READ_RECSRC;
318unsigned IOCTL_SOUND_MIXER_READ_SPEAKER = SOUND_MIXER_READ_SPEAKER;
319unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS = SOUND_MIXER_READ_STEREODEVS;
320unsigned IOCTL_SOUND_MIXER_READ_SYNTH = SOUND_MIXER_READ_SYNTH;
321unsigned IOCTL_SOUND_MIXER_READ_TREBLE = SOUND_MIXER_READ_TREBLE;
322unsigned IOCTL_SOUND_MIXER_READ_VOLUME = SOUND_MIXER_READ_VOLUME;
323unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM = SOUND_MIXER_WRITE_ALTPCM;
324unsigned IOCTL_SOUND_MIXER_WRITE_BASS = SOUND_MIXER_WRITE_BASS;
325unsigned IOCTL_SOUND_MIXER_WRITE_CD = SOUND_MIXER_WRITE_CD;
326unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE = SOUND_MIXER_WRITE_ENHANCE;
327unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN = SOUND_MIXER_WRITE_IGAIN;
328unsigned IOCTL_SOUND_MIXER_WRITE_IMIX = SOUND_MIXER_WRITE_IMIX;
329unsigned IOCTL_SOUND_MIXER_WRITE_LINE = SOUND_MIXER_WRITE_LINE;
330unsigned IOCTL_SOUND_MIXER_WRITE_LINE1 = SOUND_MIXER_WRITE_LINE1;
331unsigned IOCTL_SOUND_MIXER_WRITE_LINE2 = SOUND_MIXER_WRITE_LINE2;
332unsigned IOCTL_SOUND_MIXER_WRITE_LINE3 = SOUND_MIXER_WRITE_LINE3;
333unsigned IOCTL_SOUND_MIXER_WRITE_LOUD = SOUND_MIXER_WRITE_LOUD;
334unsigned IOCTL_SOUND_MIXER_WRITE_MIC = SOUND_MIXER_WRITE_MIC;
335unsigned IOCTL_SOUND_MIXER_WRITE_MUTE = SOUND_MIXER_WRITE_MUTE;
336unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN = SOUND_MIXER_WRITE_OGAIN;
337unsigned IOCTL_SOUND_MIXER_WRITE_PCM = SOUND_MIXER_WRITE_PCM;
338unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV = SOUND_MIXER_WRITE_RECLEV;
339unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC = SOUND_MIXER_WRITE_RECSRC;
340unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER = SOUND_MIXER_WRITE_SPEAKER;
341unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH = SOUND_MIXER_WRITE_SYNTH;
342unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE = SOUND_MIXER_WRITE_TREBLE;
343unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME = SOUND_MIXER_WRITE_VOLUME;
344unsigned IOCTL_VT_ACTIVATE = VT_ACTIVATE;
345unsigned IOCTL_VT_GETMODE = VT_GETMODE;
346unsigned IOCTL_VT_OPENQRY = VT_OPENQRY;
347unsigned IOCTL_VT_RELDISP = VT_RELDISP;
348unsigned IOCTL_VT_SETMODE = VT_SETMODE;
349unsigned IOCTL_VT_WAITACTIVE = VT_WAITACTIVE;
350unsigned IOCTL_GIO_SCRNMAP = GIO_SCRNMAP;
351unsigned IOCTL_KDDISABIO = KDDISABIO;
352unsigned IOCTL_KDENABIO = KDENABIO;
353unsigned IOCTL_KDGETLED = KDGETLED;
354unsigned IOCTL_KDGETMODE = KDGETMODE;
355unsigned IOCTL_KDGKBMODE = KDGKBMODE;
356unsigned IOCTL_KDGKBTYPE = KDGKBTYPE;
357unsigned IOCTL_KDMKTONE = KDMKTONE;
358unsigned IOCTL_KDSETLED = KDSETLED;
359unsigned IOCTL_KDSETMODE = KDSETMODE;
360unsigned IOCTL_KDSKBMODE = KDSKBMODE;
361unsigned IOCTL_KIOCSOUND = KIOCSOUND;
362unsigned IOCTL_PIO_SCRNMAP = PIO_SCRNMAP;
363unsigned IOCTL_SNDCTL_DSP_GETISPACE = SNDCTL_DSP_GETISPACE;
364
365const int si_SEGV_MAPERR = SEGV_MAPERR;
366const int si_SEGV_ACCERR = SEGV_ACCERR;
367const int unvis_valid = UNVIS_VALID;
368const int unvis_validpush = UNVIS_VALIDPUSH;
369
370const unsigned MD5_CTX_sz = sizeof(MD5_CTX);
371const unsigned MD5_return_length = MD5_DIGEST_STRING_LENGTH;
372
373#define SHA2_CONST(LEN)                                                      \
374  const unsigned SHA##LEN##_CTX_sz = sizeof(SHA##LEN##_CTX);                 \
375  const unsigned SHA##LEN##_return_length = SHA##LEN##_DIGEST_STRING_LENGTH; \
376  const unsigned SHA##LEN##_block_length = SHA##LEN##_BLOCK_LENGTH;          \
377  const unsigned SHA##LEN##_digest_length = SHA##LEN##_DIGEST_LENGTH
378
379SHA2_CONST(224);
380SHA2_CONST(256);
381SHA2_CONST(384);
382SHA2_CONST(512);
383
384#undef SHA2_CONST
385}  // namespace __sanitizer
386
387using namespace __sanitizer;
388
389COMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t));
390
391COMPILER_CHECK(sizeof(socklen_t) == sizeof(unsigned));
392CHECK_TYPE_SIZE(pthread_key_t);
393
394// There are more undocumented fields in dl_phdr_info that we are not interested
395// in.
396COMPILER_CHECK(sizeof(__sanitizer_dl_phdr_info) <= sizeof(dl_phdr_info));
397CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_addr);
398CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_name);
399CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phdr);
400CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phnum);
401
402CHECK_TYPE_SIZE(glob_t);
403CHECK_SIZE_AND_OFFSET(glob_t, gl_pathc);
404CHECK_SIZE_AND_OFFSET(glob_t, gl_pathv);
405CHECK_SIZE_AND_OFFSET(glob_t, gl_offs);
406CHECK_SIZE_AND_OFFSET(glob_t, gl_flags);
407CHECK_SIZE_AND_OFFSET(glob_t, gl_closedir);
408CHECK_SIZE_AND_OFFSET(glob_t, gl_readdir);
409CHECK_SIZE_AND_OFFSET(glob_t, gl_opendir);
410CHECK_SIZE_AND_OFFSET(glob_t, gl_lstat);
411CHECK_SIZE_AND_OFFSET(glob_t, gl_stat);
412
413CHECK_TYPE_SIZE(addrinfo);
414CHECK_SIZE_AND_OFFSET(addrinfo, ai_flags);
415CHECK_SIZE_AND_OFFSET(addrinfo, ai_family);
416CHECK_SIZE_AND_OFFSET(addrinfo, ai_socktype);
417CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);
418CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);
419CHECK_SIZE_AND_OFFSET(addrinfo, ai_addrlen);
420CHECK_SIZE_AND_OFFSET(addrinfo, ai_canonname);
421CHECK_SIZE_AND_OFFSET(addrinfo, ai_addr);
422
423CHECK_TYPE_SIZE(hostent);
424CHECK_SIZE_AND_OFFSET(hostent, h_name);
425CHECK_SIZE_AND_OFFSET(hostent, h_aliases);
426CHECK_SIZE_AND_OFFSET(hostent, h_addrtype);
427CHECK_SIZE_AND_OFFSET(hostent, h_length);
428CHECK_SIZE_AND_OFFSET(hostent, h_addr_list);
429
430CHECK_TYPE_SIZE(iovec);
431CHECK_SIZE_AND_OFFSET(iovec, iov_base);
432CHECK_SIZE_AND_OFFSET(iovec, iov_len);
433
434CHECK_TYPE_SIZE(msghdr);
435CHECK_SIZE_AND_OFFSET(msghdr, msg_name);
436CHECK_SIZE_AND_OFFSET(msghdr, msg_namelen);
437CHECK_SIZE_AND_OFFSET(msghdr, msg_iov);
438CHECK_SIZE_AND_OFFSET(msghdr, msg_iovlen);
439CHECK_SIZE_AND_OFFSET(msghdr, msg_control);
440CHECK_SIZE_AND_OFFSET(msghdr, msg_controllen);
441CHECK_SIZE_AND_OFFSET(msghdr, msg_flags);
442
443CHECK_TYPE_SIZE(cmsghdr);
444CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_len);
445CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_level);
446CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type);
447
448COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
449CHECK_SIZE_AND_OFFSET(dirent, d_ino);
450CHECK_SIZE_AND_OFFSET(dirent, d_reclen);
451
452CHECK_TYPE_SIZE(ifconf);
453CHECK_SIZE_AND_OFFSET(ifconf, ifc_len);
454CHECK_SIZE_AND_OFFSET(ifconf, ifc_ifcu);
455
456CHECK_TYPE_SIZE(pollfd);
457CHECK_SIZE_AND_OFFSET(pollfd, fd);
458CHECK_SIZE_AND_OFFSET(pollfd, events);
459CHECK_SIZE_AND_OFFSET(pollfd, revents);
460
461CHECK_TYPE_SIZE(nfds_t);
462
463CHECK_TYPE_SIZE(sigset_t);
464
465COMPILER_CHECK(sizeof(__sanitizer_sigaction) == sizeof(struct sigaction));
466// Can't write checks for sa_handler and sa_sigaction due to them being
467// preprocessor macros.
468CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask);
469
470CHECK_TYPE_SIZE(wordexp_t);
471CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);
472CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);
473CHECK_SIZE_AND_OFFSET(wordexp_t, we_offs);
474
475CHECK_TYPE_SIZE(tm);
476CHECK_SIZE_AND_OFFSET(tm, tm_sec);
477CHECK_SIZE_AND_OFFSET(tm, tm_min);
478CHECK_SIZE_AND_OFFSET(tm, tm_hour);
479CHECK_SIZE_AND_OFFSET(tm, tm_mday);
480CHECK_SIZE_AND_OFFSET(tm, tm_mon);
481CHECK_SIZE_AND_OFFSET(tm, tm_year);
482CHECK_SIZE_AND_OFFSET(tm, tm_wday);
483CHECK_SIZE_AND_OFFSET(tm, tm_yday);
484CHECK_SIZE_AND_OFFSET(tm, tm_isdst);
485CHECK_SIZE_AND_OFFSET(tm, tm_gmtoff);
486CHECK_SIZE_AND_OFFSET(tm, tm_zone);
487
488CHECK_TYPE_SIZE(ether_addr);
489
490CHECK_TYPE_SIZE(ipc_perm);
491CHECK_SIZE_AND_OFFSET(ipc_perm, key);
492CHECK_SIZE_AND_OFFSET(ipc_perm, seq);
493CHECK_SIZE_AND_OFFSET(ipc_perm, uid);
494CHECK_SIZE_AND_OFFSET(ipc_perm, gid);
495CHECK_SIZE_AND_OFFSET(ipc_perm, cuid);
496CHECK_SIZE_AND_OFFSET(ipc_perm, cgid);
497
498CHECK_TYPE_SIZE(shmid_ds);
499CHECK_SIZE_AND_OFFSET(shmid_ds, shm_perm);
500CHECK_SIZE_AND_OFFSET(shmid_ds, shm_segsz);
501CHECK_SIZE_AND_OFFSET(shmid_ds, shm_atime);
502CHECK_SIZE_AND_OFFSET(shmid_ds, shm_dtime);
503CHECK_SIZE_AND_OFFSET(shmid_ds, shm_ctime);
504CHECK_SIZE_AND_OFFSET(shmid_ds, shm_cpid);
505CHECK_SIZE_AND_OFFSET(shmid_ds, shm_lpid);
506CHECK_SIZE_AND_OFFSET(shmid_ds, shm_nattch);
507
508CHECK_TYPE_SIZE(clock_t);
509
510CHECK_TYPE_SIZE(ifaddrs);
511CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);
512CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);
513CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_addr);
514CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_netmask);
515#undef ifa_dstaddr
516CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_dstaddr);
517CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_data);
518
519CHECK_TYPE_SIZE(timeb);
520CHECK_SIZE_AND_OFFSET(timeb, time);
521CHECK_SIZE_AND_OFFSET(timeb, millitm);
522CHECK_SIZE_AND_OFFSET(timeb, timezone);
523CHECK_SIZE_AND_OFFSET(timeb, dstflag);
524
525CHECK_TYPE_SIZE(passwd);
526CHECK_SIZE_AND_OFFSET(passwd, pw_name);
527CHECK_SIZE_AND_OFFSET(passwd, pw_passwd);
528CHECK_SIZE_AND_OFFSET(passwd, pw_uid);
529CHECK_SIZE_AND_OFFSET(passwd, pw_gid);
530CHECK_SIZE_AND_OFFSET(passwd, pw_dir);
531CHECK_SIZE_AND_OFFSET(passwd, pw_shell);
532
533CHECK_SIZE_AND_OFFSET(passwd, pw_gecos);
534
535CHECK_TYPE_SIZE(group);
536CHECK_SIZE_AND_OFFSET(group, gr_name);
537CHECK_SIZE_AND_OFFSET(group, gr_passwd);
538CHECK_SIZE_AND_OFFSET(group, gr_gid);
539CHECK_SIZE_AND_OFFSET(group, gr_mem);
540
541#if HAVE_RPC_XDR_H
542CHECK_TYPE_SIZE(XDR);
543CHECK_SIZE_AND_OFFSET(XDR, x_op);
544CHECK_SIZE_AND_OFFSET(XDR, x_ops);
545CHECK_SIZE_AND_OFFSET(XDR, x_public);
546CHECK_SIZE_AND_OFFSET(XDR, x_private);
547CHECK_SIZE_AND_OFFSET(XDR, x_base);
548CHECK_SIZE_AND_OFFSET(XDR, x_handy);
549COMPILER_CHECK(__sanitizer_XDR_ENCODE == XDR_ENCODE);
550COMPILER_CHECK(__sanitizer_XDR_DECODE == XDR_DECODE);
551COMPILER_CHECK(__sanitizer_XDR_FREE == XDR_FREE);
552#endif
553
554CHECK_TYPE_SIZE(sem_t);
555
556COMPILER_CHECK(sizeof(__sanitizer_cap_rights_t) >= sizeof(cap_rights_t));
557#endif  // SANITIZER_FREEBSD
558