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