Home | History | Annotate | Line # | Download | only in sanitizer_common
      1 //===-- sanitizer_platform_limits_posix.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 POSIX data structures.
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef SANITIZER_PLATFORM_LIMITS_POSIX_H
     16 #define SANITIZER_PLATFORM_LIMITS_POSIX_H
     17 
     18 #if SANITIZER_LINUX || SANITIZER_MAC
     19 
     20 #include "sanitizer_internal_defs.h"
     21 #include "sanitizer_platform.h"
     22 
     23 # define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map*)(handle))
     24 
     25 #ifndef __GLIBC_PREREQ
     26 #define __GLIBC_PREREQ(x, y) 0
     27 #endif
     28 
     29 namespace __sanitizer {
     30   extern unsigned struct_utsname_sz;
     31   extern unsigned struct_stat_sz;
     32 #if !SANITIZER_IOS
     33   extern unsigned struct_stat64_sz;
     34 #endif
     35   extern unsigned struct_rusage_sz;
     36   extern unsigned siginfo_t_sz;
     37   extern unsigned struct_itimerval_sz;
     38   extern unsigned pthread_t_sz;
     39   extern unsigned pthread_mutex_t_sz;
     40   extern unsigned pthread_cond_t_sz;
     41   extern unsigned pid_t_sz;
     42   extern unsigned timeval_sz;
     43   extern unsigned uid_t_sz;
     44   extern unsigned gid_t_sz;
     45   extern unsigned mbstate_t_sz;
     46   extern unsigned struct_timezone_sz;
     47   extern unsigned struct_tms_sz;
     48   extern unsigned struct_itimerspec_sz;
     49   extern unsigned struct_sigevent_sz;
     50   extern unsigned struct_sched_param_sz;
     51   extern unsigned struct_statfs64_sz;
     52   extern unsigned struct_regex_sz;
     53   extern unsigned struct_regmatch_sz;
     54 
     55 #if !SANITIZER_ANDROID
     56   extern unsigned struct_fstab_sz;
     57   extern unsigned struct_statfs_sz;
     58   extern unsigned struct_sockaddr_sz;
     59   extern unsigned ucontext_t_sz;
     60 #endif // !SANITIZER_ANDROID
     61 
     62 #if SANITIZER_LINUX
     63 
     64 #if defined(__x86_64__)
     65   const unsigned struct_kernel_stat_sz = 144;
     66   const unsigned struct_kernel_stat64_sz = 0;
     67 #elif defined(__i386__)
     68   const unsigned struct_kernel_stat_sz = 64;
     69   const unsigned struct_kernel_stat64_sz = 96;
     70 #elif defined(__arm__)
     71   const unsigned struct_kernel_stat_sz = 64;
     72   const unsigned struct_kernel_stat64_sz = 104;
     73 #elif defined(__aarch64__)
     74   const unsigned struct_kernel_stat_sz = 128;
     75   const unsigned struct_kernel_stat64_sz = 104;
     76 #elif defined(__powerpc__) && !defined(__powerpc64__)
     77   const unsigned struct_kernel_stat_sz = 72;
     78   const unsigned struct_kernel_stat64_sz = 104;
     79 #elif defined(__powerpc64__)
     80   const unsigned struct_kernel_stat_sz = 144;
     81   const unsigned struct_kernel_stat64_sz = 104;
     82 #elif defined(__mips__)
     83   const unsigned struct_kernel_stat_sz =
     84                  SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) :
     85                                      FIRST_32_SECOND_64(160, 216);
     86   const unsigned struct_kernel_stat64_sz = 104;
     87 #elif defined(__s390__) && !defined(__s390x__)
     88   const unsigned struct_kernel_stat_sz = 64;
     89   const unsigned struct_kernel_stat64_sz = 104;
     90 #elif defined(__s390x__)
     91   const unsigned struct_kernel_stat_sz = 144;
     92   const unsigned struct_kernel_stat64_sz = 0;
     93 #elif defined(__sparc__) && defined(__arch64__)
     94   const unsigned struct___old_kernel_stat_sz = 0;
     95   const unsigned struct_kernel_stat_sz = 104;
     96   const unsigned struct_kernel_stat64_sz = 144;
     97 #elif defined(__sparc__) && !defined(__arch64__)
     98   const unsigned struct___old_kernel_stat_sz = 0;
     99   const unsigned struct_kernel_stat_sz = 64;
    100   const unsigned struct_kernel_stat64_sz = 104;
    101 #endif
    102   struct __sanitizer_perf_event_attr {
    103     unsigned type;
    104     unsigned size;
    105     // More fields that vary with the kernel version.
    106   };
    107 
    108   extern unsigned struct_epoll_event_sz;
    109   extern unsigned struct_sysinfo_sz;
    110   extern unsigned __user_cap_header_struct_sz;
    111   extern unsigned __user_cap_data_struct_sz;
    112   extern unsigned struct_new_utsname_sz;
    113   extern unsigned struct_old_utsname_sz;
    114   extern unsigned struct_oldold_utsname_sz;
    115 
    116   const unsigned struct_kexec_segment_sz = 4 * sizeof(unsigned long);
    117 #endif  // SANITIZER_LINUX
    118 
    119 #if SANITIZER_LINUX
    120 
    121 #if defined(__powerpc64__) || defined(__s390__)
    122   const unsigned struct___old_kernel_stat_sz = 0;
    123 #elif !defined(__sparc__)
    124   const unsigned struct___old_kernel_stat_sz = 32;
    125 #endif
    126 
    127   extern unsigned struct_rlimit_sz;
    128   extern unsigned struct_utimbuf_sz;
    129   extern unsigned struct_timespec_sz;
    130 
    131   struct __sanitizer_iocb {
    132     u64   aio_data;
    133     u32   aio_key_or_aio_reserved1; // Simply crazy.
    134     u32   aio_reserved1_or_aio_key; // Luckily, we don't need these.
    135     u16   aio_lio_opcode;
    136     s16   aio_reqprio;
    137     u32   aio_fildes;
    138     u64   aio_buf;
    139     u64   aio_nbytes;
    140     s64   aio_offset;
    141     u64   aio_reserved2;
    142     u64   aio_reserved3;
    143   };
    144 
    145   struct __sanitizer_io_event {
    146     u64 data;
    147     u64 obj;
    148     u64 res;
    149     u64 res2;
    150   };
    151 
    152   const unsigned iocb_cmd_pread = 0;
    153   const unsigned iocb_cmd_pwrite = 1;
    154   const unsigned iocb_cmd_preadv = 7;
    155   const unsigned iocb_cmd_pwritev = 8;
    156 
    157   struct __sanitizer___sysctl_args {
    158     int *name;
    159     int nlen;
    160     void *oldval;
    161     uptr *oldlenp;
    162     void *newval;
    163     uptr newlen;
    164     unsigned long ___unused[4];
    165   };
    166 
    167   const unsigned old_sigset_t_sz = sizeof(unsigned long);
    168 
    169   struct __sanitizer_sem_t {
    170 #if SANITIZER_ANDROID && defined(_LP64)
    171     int data[4];
    172 #elif SANITIZER_ANDROID && !defined(_LP64)
    173     int data;
    174 #elif SANITIZER_LINUX
    175     uptr data[4];
    176 #endif
    177   };
    178 #endif // SANITIZER_LINUX
    179 
    180 #if SANITIZER_ANDROID
    181   struct __sanitizer_struct_mallinfo {
    182     uptr v[10];
    183   };
    184 #endif
    185 
    186 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    187   struct __sanitizer_struct_mallinfo {
    188     int v[10];
    189   };
    190 
    191   extern unsigned struct_ustat_sz;
    192   extern unsigned struct_rlimit64_sz;
    193   extern unsigned struct_statvfs64_sz;
    194 
    195   struct __sanitizer_ipc_perm {
    196     int __key;
    197     int uid;
    198     int gid;
    199     int cuid;
    200     int cgid;
    201 #ifdef __powerpc__
    202     unsigned mode;
    203     unsigned __seq;
    204     u64 __unused1;
    205     u64 __unused2;
    206 #elif defined(__sparc__)
    207 #if defined(__arch64__)
    208     unsigned mode;
    209     unsigned short __pad1;
    210 #else
    211     unsigned short __pad1;
    212     unsigned short mode;
    213     unsigned short __pad2;
    214 #endif
    215     unsigned short __seq;
    216     unsigned long long __unused1;
    217     unsigned long long __unused2;
    218 #elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__)
    219     unsigned int mode;
    220     unsigned short __seq;
    221     unsigned short __pad1;
    222     unsigned long __unused1;
    223     unsigned long __unused2;
    224 #else
    225     unsigned short mode;
    226     unsigned short __pad1;
    227     unsigned short __seq;
    228     unsigned short __pad2;
    229 #if defined(__x86_64__) && !defined(_LP64)
    230     u64 __unused1;
    231     u64 __unused2;
    232 #else
    233     unsigned long __unused1;
    234     unsigned long __unused2;
    235 #endif
    236 #endif
    237   };
    238 
    239   struct __sanitizer_shmid_ds {
    240     __sanitizer_ipc_perm shm_perm;
    241   #if defined(__sparc__)
    242   #if !defined(__arch64__)
    243     u32 __pad1;
    244   #endif
    245     long shm_atime;
    246   #if !defined(__arch64__)
    247     u32 __pad2;
    248   #endif
    249     long shm_dtime;
    250   #if !defined(__arch64__)
    251     u32 __pad3;
    252   #endif
    253     long shm_ctime;
    254     uptr shm_segsz;
    255     int shm_cpid;
    256     int shm_lpid;
    257     unsigned long shm_nattch;
    258     unsigned long __glibc_reserved1;
    259     unsigned long __glibc_reserved2;
    260   #else
    261   #ifndef __powerpc__
    262     uptr shm_segsz;
    263   #elif !defined(__powerpc64__)
    264     uptr __unused0;
    265   #endif
    266   #if defined(__x86_64__) && !defined(_LP64)
    267     u64 shm_atime;
    268     u64 shm_dtime;
    269     u64 shm_ctime;
    270   #else
    271     uptr shm_atime;
    272   #if !defined(_LP64) && !defined(__mips__)
    273     uptr __unused1;
    274   #endif
    275     uptr shm_dtime;
    276   #if !defined(_LP64) && !defined(__mips__)
    277     uptr __unused2;
    278   #endif
    279     uptr shm_ctime;
    280   #if !defined(_LP64) && !defined(__mips__)
    281     uptr __unused3;
    282   #endif
    283   #endif
    284   #ifdef __powerpc__
    285     uptr shm_segsz;
    286   #endif
    287     int shm_cpid;
    288     int shm_lpid;
    289   #if defined(__x86_64__) && !defined(_LP64)
    290     u64 shm_nattch;
    291     u64 __unused4;
    292     u64 __unused5;
    293   #else
    294     uptr shm_nattch;
    295     uptr __unused4;
    296     uptr __unused5;
    297   #endif
    298 #endif
    299   };
    300 #endif
    301 
    302 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    303   extern unsigned struct_msqid_ds_sz;
    304   extern unsigned struct_mq_attr_sz;
    305   extern unsigned struct_timex_sz;
    306   extern unsigned struct_statvfs_sz;
    307 #endif  // SANITIZER_LINUX && !SANITIZER_ANDROID
    308 
    309   struct __sanitizer_iovec {
    310     void *iov_base;
    311     uptr iov_len;
    312   };
    313 
    314 #if !SANITIZER_ANDROID
    315   struct __sanitizer_ifaddrs {
    316     struct __sanitizer_ifaddrs *ifa_next;
    317     char *ifa_name;
    318     unsigned int ifa_flags;
    319     void *ifa_addr;    // (struct sockaddr *)
    320     void *ifa_netmask; // (struct sockaddr *)
    321     // This is a union on Linux.
    322 # ifdef ifa_dstaddr
    323 # undef ifa_dstaddr
    324 # endif
    325     void *ifa_dstaddr; // (struct sockaddr *)
    326     void *ifa_data;
    327   };
    328 #endif  // !SANITIZER_ANDROID
    329 
    330 #if SANITIZER_MAC
    331   typedef unsigned long __sanitizer_pthread_key_t;
    332 #else
    333   typedef unsigned __sanitizer_pthread_key_t;
    334 #endif
    335 
    336 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    337 
    338   struct __sanitizer_XDR {
    339     int x_op;
    340     void *x_ops;
    341     uptr x_public;
    342     uptr x_private;
    343     uptr x_base;
    344     unsigned x_handy;
    345   };
    346 
    347   const int __sanitizer_XDR_ENCODE = 0;
    348   const int __sanitizer_XDR_DECODE = 1;
    349   const int __sanitizer_XDR_FREE = 2;
    350 #endif
    351 
    352   struct __sanitizer_passwd {
    353     char *pw_name;
    354     char *pw_passwd;
    355     int pw_uid;
    356     int pw_gid;
    357 #if SANITIZER_MAC
    358     long pw_change;
    359     char *pw_class;
    360 #endif
    361 #if !(SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32))
    362     char *pw_gecos;
    363 #endif
    364     char *pw_dir;
    365     char *pw_shell;
    366 #if SANITIZER_MAC
    367     long pw_expire;
    368 #endif
    369   };
    370 
    371   struct __sanitizer_group {
    372     char *gr_name;
    373     char *gr_passwd;
    374     int gr_gid;
    375     char **gr_mem;
    376   };
    377 
    378 #if defined(__x86_64__) && !defined(_LP64)
    379   typedef long long __sanitizer_time_t;
    380 #else
    381   typedef long __sanitizer_time_t;
    382 #endif
    383 
    384   typedef long __sanitizer_suseconds_t;
    385 
    386   struct __sanitizer_timeval {
    387     __sanitizer_time_t tv_sec;
    388     __sanitizer_suseconds_t tv_usec;
    389   };
    390 
    391   struct __sanitizer_itimerval {
    392     struct __sanitizer_timeval it_interval;
    393     struct __sanitizer_timeval it_value;
    394   };
    395 
    396   struct __sanitizer_timeb {
    397     __sanitizer_time_t time;
    398     unsigned short millitm;
    399     short timezone;
    400     short dstflag;
    401   };
    402 
    403   struct __sanitizer_ether_addr {
    404     u8 octet[6];
    405   };
    406 
    407   struct __sanitizer_tm {
    408     int tm_sec;
    409     int tm_min;
    410     int tm_hour;
    411     int tm_mday;
    412     int tm_mon;
    413     int tm_year;
    414     int tm_wday;
    415     int tm_yday;
    416     int tm_isdst;
    417     long int tm_gmtoff;
    418     const char *tm_zone;
    419   };
    420 
    421 #if SANITIZER_LINUX
    422   struct __sanitizer_mntent {
    423     char *mnt_fsname;
    424     char *mnt_dir;
    425     char *mnt_type;
    426     char *mnt_opts;
    427     int mnt_freq;
    428     int mnt_passno;
    429   };
    430 
    431   struct __sanitizer_file_handle {
    432     unsigned int handle_bytes;
    433     int handle_type;
    434     unsigned char f_handle[1];  // variable sized
    435   };
    436 #endif
    437 
    438 #if SANITIZER_MAC
    439   struct __sanitizer_msghdr {
    440     void *msg_name;
    441     unsigned msg_namelen;
    442     struct __sanitizer_iovec *msg_iov;
    443     unsigned msg_iovlen;
    444     void *msg_control;
    445     unsigned msg_controllen;
    446     int msg_flags;
    447   };
    448   struct __sanitizer_cmsghdr {
    449     unsigned cmsg_len;
    450     int cmsg_level;
    451     int cmsg_type;
    452   };
    453 #else
    454   struct __sanitizer_msghdr {
    455     void *msg_name;
    456     unsigned msg_namelen;
    457     struct __sanitizer_iovec *msg_iov;
    458     uptr msg_iovlen;
    459     void *msg_control;
    460     uptr msg_controllen;
    461     int msg_flags;
    462   };
    463   struct __sanitizer_cmsghdr {
    464     uptr cmsg_len;
    465     int cmsg_level;
    466     int cmsg_type;
    467   };
    468 #endif
    469 
    470 #if SANITIZER_LINUX
    471   struct __sanitizer_mmsghdr {
    472     __sanitizer_msghdr msg_hdr;
    473     unsigned int msg_len;
    474   };
    475 #endif
    476 
    477 #if SANITIZER_MAC
    478   struct __sanitizer_dirent {
    479     unsigned long long d_ino;
    480     unsigned long long d_seekoff;
    481     unsigned short d_reclen;
    482     // more fields that we don't care about
    483   };
    484 #elif SANITIZER_ANDROID || defined(__x86_64__)
    485   struct __sanitizer_dirent {
    486     unsigned long long d_ino;
    487     unsigned long long d_off;
    488     unsigned short d_reclen;
    489     // more fields that we don't care about
    490   };
    491 #else
    492   struct __sanitizer_dirent {
    493     uptr d_ino;
    494     uptr d_off;
    495     unsigned short d_reclen;
    496     // more fields that we don't care about
    497   };
    498 #endif
    499 
    500 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    501   struct __sanitizer_dirent64 {
    502     unsigned long long d_ino;
    503     unsigned long long d_off;
    504     unsigned short d_reclen;
    505     // more fields that we don't care about
    506   };
    507 #endif
    508 
    509 #if defined(__x86_64__) && !defined(_LP64)
    510   typedef long long __sanitizer_clock_t;
    511 #else
    512   typedef long __sanitizer_clock_t;
    513 #endif
    514 
    515 #if SANITIZER_LINUX
    516   typedef int __sanitizer_clockid_t;
    517 #endif
    518 
    519 #if SANITIZER_LINUX
    520 #if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__)\
    521                    || defined(__mips__)
    522   typedef unsigned __sanitizer___kernel_uid_t;
    523   typedef unsigned __sanitizer___kernel_gid_t;
    524 #else
    525   typedef unsigned short __sanitizer___kernel_uid_t;
    526   typedef unsigned short __sanitizer___kernel_gid_t;
    527 #endif
    528 #if defined(__x86_64__) && !defined(_LP64)
    529   typedef long long __sanitizer___kernel_off_t;
    530 #else
    531   typedef long __sanitizer___kernel_off_t;
    532 #endif
    533 
    534 #if defined(__powerpc__) || defined(__mips__)
    535   typedef unsigned int __sanitizer___kernel_old_uid_t;
    536   typedef unsigned int __sanitizer___kernel_old_gid_t;
    537 #else
    538   typedef unsigned short __sanitizer___kernel_old_uid_t;
    539   typedef unsigned short __sanitizer___kernel_old_gid_t;
    540 #endif
    541 
    542   typedef long long __sanitizer___kernel_loff_t;
    543   typedef struct {
    544     unsigned long fds_bits[1024 / (8 * sizeof(long))];
    545   } __sanitizer___kernel_fd_set;
    546 #endif
    547 
    548   // This thing depends on the platform. We are only interested in the upper
    549   // limit. Verified with a compiler assert in .cc.
    550   const int pthread_attr_t_max_sz = 128;
    551   union __sanitizer_pthread_attr_t {
    552     char size[pthread_attr_t_max_sz]; // NOLINT
    553     void *align;
    554   };
    555 
    556 #if SANITIZER_ANDROID
    557 # if SANITIZER_MIPS
    558   typedef unsigned long __sanitizer_sigset_t[16/sizeof(unsigned long)];
    559 # else
    560   typedef unsigned long __sanitizer_sigset_t;
    561 # endif
    562 #elif SANITIZER_MAC
    563   typedef unsigned __sanitizer_sigset_t;
    564 #elif SANITIZER_LINUX
    565   struct __sanitizer_sigset_t {
    566     // The size is determined by looking at sizeof of real sigset_t on linux.
    567     uptr val[128 / sizeof(uptr)];
    568   };
    569 #endif
    570 
    571   struct __sanitizer_siginfo {
    572     // The size is determined by looking at sizeof of real siginfo_t on linux.
    573     u64 opaque[128 / sizeof(u64)];
    574   };
    575 
    576   using __sanitizer_sighandler_ptr = void (*)(int sig);
    577   using __sanitizer_sigactionhandler_ptr =
    578       void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx);
    579 
    580   // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.
    581 #if SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 64)
    582   struct __sanitizer_sigaction {
    583     unsigned sa_flags;
    584     union {
    585       __sanitizer_sigactionhandler_ptr sigaction;
    586       __sanitizer_sighandler_ptr handler;
    587     };
    588     __sanitizer_sigset_t sa_mask;
    589     void (*sa_restorer)();
    590   };
    591 #elif SANITIZER_ANDROID && SANITIZER_MIPS32  // check this before WORDSIZE == 32
    592   struct __sanitizer_sigaction {
    593     unsigned sa_flags;
    594     union {
    595       __sanitizer_sigactionhandler_ptr sigaction;
    596       __sanitizer_sighandler_ptr handler;
    597     };
    598     __sanitizer_sigset_t sa_mask;
    599   };
    600 #elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)
    601   struct __sanitizer_sigaction {
    602     union {
    603       __sanitizer_sigactionhandler_ptr sigaction;
    604       __sanitizer_sighandler_ptr handler;
    605     };
    606     __sanitizer_sigset_t sa_mask;
    607     uptr sa_flags;
    608     void (*sa_restorer)();
    609   };
    610 #else // !SANITIZER_ANDROID
    611   struct __sanitizer_sigaction {
    612 #if defined(__mips__) && !SANITIZER_FREEBSD
    613     unsigned int sa_flags;
    614 #endif
    615     union {
    616       __sanitizer_sigactionhandler_ptr sigaction;
    617       __sanitizer_sighandler_ptr handler;
    618     };
    619 #if SANITIZER_FREEBSD
    620     int sa_flags;
    621     __sanitizer_sigset_t sa_mask;
    622 #else
    623 #if defined(__s390x__)
    624     int sa_resv;
    625 #else
    626     __sanitizer_sigset_t sa_mask;
    627 #endif
    628 #ifndef __mips__
    629 #if defined(__sparc__)
    630 #if __GLIBC_PREREQ (2, 20)
    631     // On sparc glibc 2.19 and earlier sa_flags was unsigned long.
    632 #if defined(__arch64__)
    633     // To maintain ABI compatibility on sparc64 when switching to an int,
    634     // __glibc_reserved0 was added.
    635     int __glibc_reserved0;
    636 #endif
    637     int sa_flags;
    638 #else
    639     unsigned long sa_flags;
    640 #endif
    641 #else
    642     int sa_flags;
    643 #endif
    644 #endif
    645 #endif
    646 #if SANITIZER_LINUX
    647     void (*sa_restorer)();
    648 #endif
    649 #if defined(__mips__) && (SANITIZER_WORDSIZE == 32)
    650     int sa_resv[1];
    651 #endif
    652 #if defined(__s390x__)
    653     __sanitizer_sigset_t sa_mask;
    654 #endif
    655   };
    656 #endif // !SANITIZER_ANDROID
    657 
    658 #if defined(__mips__)
    659   struct __sanitizer_kernel_sigset_t {
    660     uptr sig[2];
    661   };
    662 #else
    663   struct __sanitizer_kernel_sigset_t {
    664     u8 sig[8];
    665   };
    666 #endif
    667 
    668   // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.
    669 #if SANITIZER_MIPS
    670   struct __sanitizer_kernel_sigaction_t {
    671     unsigned int sa_flags;
    672     union {
    673       void (*handler)(int signo);
    674       void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
    675     };
    676     __sanitizer_kernel_sigset_t sa_mask;
    677     void (*sa_restorer)(void);
    678   };
    679 #else
    680   struct __sanitizer_kernel_sigaction_t {
    681     union {
    682       void (*handler)(int signo);
    683       void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
    684     };
    685     unsigned long sa_flags;
    686     void (*sa_restorer)(void);
    687     __sanitizer_kernel_sigset_t sa_mask;
    688   };
    689 #endif
    690 
    691   extern const uptr sig_ign;
    692   extern const uptr sig_dfl;
    693   extern const uptr sig_err;
    694   extern const uptr sa_siginfo;
    695 
    696 #if SANITIZER_LINUX
    697   extern int e_tabsz;
    698 #endif
    699 
    700   extern int af_inet;
    701   extern int af_inet6;
    702   uptr __sanitizer_in_addr_sz(int af);
    703 
    704 #if SANITIZER_LINUX
    705   struct __sanitizer_dl_phdr_info {
    706     uptr dlpi_addr;
    707     const char *dlpi_name;
    708     const void *dlpi_phdr;
    709     short dlpi_phnum;
    710   };
    711 
    712   extern unsigned struct_ElfW_Phdr_sz;
    713 #endif
    714 
    715   struct __sanitizer_addrinfo {
    716     int ai_flags;
    717     int ai_family;
    718     int ai_socktype;
    719     int ai_protocol;
    720 #if SANITIZER_ANDROID || SANITIZER_MAC
    721     unsigned ai_addrlen;
    722     char *ai_canonname;
    723     void *ai_addr;
    724 #else // LINUX
    725     unsigned ai_addrlen;
    726     void *ai_addr;
    727     char *ai_canonname;
    728 #endif
    729     struct __sanitizer_addrinfo *ai_next;
    730   };
    731 
    732   struct __sanitizer_hostent {
    733     char *h_name;
    734     char **h_aliases;
    735     int h_addrtype;
    736     int h_length;
    737     char **h_addr_list;
    738   };
    739 
    740   struct __sanitizer_pollfd {
    741     int fd;
    742     short events;
    743     short revents;
    744   };
    745 
    746 #if SANITIZER_ANDROID || SANITIZER_MAC
    747   typedef unsigned __sanitizer_nfds_t;
    748 #else
    749   typedef unsigned long __sanitizer_nfds_t;
    750 #endif
    751 
    752 #if !SANITIZER_ANDROID
    753 # if SANITIZER_LINUX
    754   struct __sanitizer_glob_t {
    755     uptr gl_pathc;
    756     char **gl_pathv;
    757     uptr gl_offs;
    758     int gl_flags;
    759 
    760     void (*gl_closedir)(void *dirp);
    761     void *(*gl_readdir)(void *dirp);
    762     void *(*gl_opendir)(const char *);
    763     int (*gl_lstat)(const char *, void *);
    764     int (*gl_stat)(const char *, void *);
    765   };
    766 # endif  // SANITIZER_LINUX
    767 
    768 # if SANITIZER_LINUX
    769   extern int glob_nomatch;
    770   extern int glob_altdirfunc;
    771 # endif
    772 #endif  // !SANITIZER_ANDROID
    773 
    774   extern unsigned path_max;
    775 
    776   struct __sanitizer_wordexp_t {
    777     uptr we_wordc;
    778     char **we_wordv;
    779     uptr we_offs;
    780   };
    781 
    782 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    783   struct __sanitizer_FILE {
    784     int _flags;
    785     char *_IO_read_ptr;
    786     char *_IO_read_end;
    787     char *_IO_read_base;
    788     char *_IO_write_base;
    789     char *_IO_write_ptr;
    790     char *_IO_write_end;
    791     char *_IO_buf_base;
    792     char *_IO_buf_end;
    793     char *_IO_save_base;
    794     char *_IO_backup_base;
    795     char *_IO_save_end;
    796     void *_markers;
    797     __sanitizer_FILE *_chain;
    798     int _fileno;
    799   };
    800 # define SANITIZER_HAS_STRUCT_FILE 1
    801 #else
    802   typedef void __sanitizer_FILE;
    803 # define SANITIZER_HAS_STRUCT_FILE 0
    804 #endif
    805 
    806 #if SANITIZER_LINUX && !SANITIZER_ANDROID && \
    807   (defined(__i386) || defined(__x86_64) || defined(__mips64) || \
    808     defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
    809     defined(__s390__))
    810   extern unsigned struct_user_regs_struct_sz;
    811   extern unsigned struct_user_fpregs_struct_sz;
    812   extern unsigned struct_user_fpxregs_struct_sz;
    813   extern unsigned struct_user_vfpregs_struct_sz;
    814 
    815   extern int ptrace_peektext;
    816   extern int ptrace_peekdata;
    817   extern int ptrace_peekuser;
    818   extern int ptrace_getregs;
    819   extern int ptrace_setregs;
    820   extern int ptrace_getfpregs;
    821   extern int ptrace_setfpregs;
    822   extern int ptrace_getfpxregs;
    823   extern int ptrace_setfpxregs;
    824   extern int ptrace_getvfpregs;
    825   extern int ptrace_setvfpregs;
    826   extern int ptrace_getsiginfo;
    827   extern int ptrace_setsiginfo;
    828   extern int ptrace_getregset;
    829   extern int ptrace_setregset;
    830   extern int ptrace_geteventmsg;
    831 #endif
    832 
    833 #if SANITIZER_LINUX  && !SANITIZER_ANDROID
    834   extern unsigned struct_shminfo_sz;
    835   extern unsigned struct_shm_info_sz;
    836   extern int shmctl_ipc_stat;
    837   extern int shmctl_ipc_info;
    838   extern int shmctl_shm_info;
    839   extern int shmctl_shm_stat;
    840 #endif
    841 
    842 #if !SANITIZER_MAC && !SANITIZER_FREEBSD
    843   extern unsigned struct_utmp_sz;
    844 #endif
    845 #if !SANITIZER_ANDROID
    846   extern unsigned struct_utmpx_sz;
    847 #endif
    848 
    849   extern int map_fixed;
    850 
    851   // ioctl arguments
    852   struct __sanitizer_ifconf {
    853     int ifc_len;
    854     union {
    855       void *ifcu_req;
    856     } ifc_ifcu;
    857 #if SANITIZER_MAC
    858   } __attribute__((packed));
    859 #else
    860   };
    861 #endif
    862 
    863 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    864 struct __sanitizer__obstack_chunk {
    865   char *limit;
    866   struct __sanitizer__obstack_chunk *prev;
    867 };
    868 
    869 struct __sanitizer_obstack {
    870   long chunk_size;
    871   struct __sanitizer__obstack_chunk *chunk;
    872   char *object_base;
    873   char *next_free;
    874   uptr more_fields[7];
    875 };
    876 
    877 typedef uptr (*__sanitizer_cookie_io_read)(void *cookie, char *buf, uptr size);
    878 typedef uptr (*__sanitizer_cookie_io_write)(void *cookie, const char *buf,
    879                                             uptr size);
    880 typedef int (*__sanitizer_cookie_io_seek)(void *cookie, u64 *offset,
    881                                           int whence);
    882 typedef int (*__sanitizer_cookie_io_close)(void *cookie);
    883 
    884 struct __sanitizer_cookie_io_functions_t {
    885   __sanitizer_cookie_io_read read;
    886   __sanitizer_cookie_io_write write;
    887   __sanitizer_cookie_io_seek seek;
    888   __sanitizer_cookie_io_close close;
    889 };
    890 #endif
    891 
    892 #define IOC_NRBITS 8
    893 #define IOC_TYPEBITS 8
    894 #if defined(__powerpc__) || defined(__powerpc64__) || defined(__mips__) || \
    895     defined(__sparc__)
    896 #define IOC_SIZEBITS 13
    897 #define IOC_DIRBITS 3
    898 #define IOC_NONE 1U
    899 #define IOC_WRITE 4U
    900 #define IOC_READ 2U
    901 #else
    902 #define IOC_SIZEBITS 14
    903 #define IOC_DIRBITS 2
    904 #define IOC_NONE 0U
    905 #define IOC_WRITE 1U
    906 #define IOC_READ 2U
    907 #endif
    908 #define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
    909 #define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
    910 #define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
    911 #if defined(IOC_DIRMASK)
    912 #undef IOC_DIRMASK
    913 #endif
    914 #define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
    915 #define IOC_NRSHIFT 0
    916 #define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
    917 #define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
    918 #define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
    919 #define EVIOC_EV_MAX 0x1f
    920 #define EVIOC_ABS_MAX 0x3f
    921 
    922 #define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
    923 #define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
    924 #define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)
    925 
    926 #if defined(__sparc__)
    927 // In sparc the 14 bits SIZE field overlaps with the
    928 // least significant bit of DIR, so either IOC_READ or
    929 // IOC_WRITE shall be 1 in order to get a non-zero SIZE.
    930 #define IOC_SIZE(nr) \
    931   ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
    932 #else
    933 #define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
    934 #endif
    935 
    936   extern unsigned struct_ifreq_sz;
    937   extern unsigned struct_termios_sz;
    938   extern unsigned struct_winsize_sz;
    939 
    940 #if SANITIZER_LINUX
    941   extern unsigned struct_arpreq_sz;
    942   extern unsigned struct_cdrom_msf_sz;
    943   extern unsigned struct_cdrom_multisession_sz;
    944   extern unsigned struct_cdrom_read_audio_sz;
    945   extern unsigned struct_cdrom_subchnl_sz;
    946   extern unsigned struct_cdrom_ti_sz;
    947   extern unsigned struct_cdrom_tocentry_sz;
    948   extern unsigned struct_cdrom_tochdr_sz;
    949   extern unsigned struct_cdrom_volctrl_sz;
    950   extern unsigned struct_ff_effect_sz;
    951   extern unsigned struct_floppy_drive_params_sz;
    952   extern unsigned struct_floppy_drive_struct_sz;
    953   extern unsigned struct_floppy_fdc_state_sz;
    954   extern unsigned struct_floppy_max_errors_sz;
    955   extern unsigned struct_floppy_raw_cmd_sz;
    956   extern unsigned struct_floppy_struct_sz;
    957   extern unsigned struct_floppy_write_errors_sz;
    958   extern unsigned struct_format_descr_sz;
    959   extern unsigned struct_hd_driveid_sz;
    960   extern unsigned struct_hd_geometry_sz;
    961   extern unsigned struct_input_absinfo_sz;
    962   extern unsigned struct_input_id_sz;
    963   extern unsigned struct_mtpos_sz;
    964   extern unsigned struct_termio_sz;
    965   extern unsigned struct_vt_consize_sz;
    966   extern unsigned struct_vt_sizes_sz;
    967   extern unsigned struct_vt_stat_sz;
    968 #endif  // SANITIZER_LINUX
    969 
    970 #if SANITIZER_LINUX
    971   extern unsigned struct_copr_buffer_sz;
    972   extern unsigned struct_copr_debug_buf_sz;
    973   extern unsigned struct_copr_msg_sz;
    974   extern unsigned struct_midi_info_sz;
    975   extern unsigned struct_mtget_sz;
    976   extern unsigned struct_mtop_sz;
    977   extern unsigned struct_rtentry_sz;
    978   extern unsigned struct_sbi_instrument_sz;
    979   extern unsigned struct_seq_event_rec_sz;
    980   extern unsigned struct_synth_info_sz;
    981   extern unsigned struct_vt_mode_sz;
    982 #endif // SANITIZER_LINUX
    983 
    984 #if SANITIZER_LINUX && !SANITIZER_ANDROID
    985   extern unsigned struct_ax25_parms_struct_sz;
    986   extern unsigned struct_cyclades_monitor_sz;
    987   extern unsigned struct_input_keymap_entry_sz;
    988   extern unsigned struct_ipx_config_data_sz;
    989   extern unsigned struct_kbdiacrs_sz;
    990   extern unsigned struct_kbentry_sz;
    991   extern unsigned struct_kbkeycode_sz;
    992   extern unsigned struct_kbsentry_sz;
    993   extern unsigned struct_mtconfiginfo_sz;
    994   extern unsigned struct_nr_parms_struct_sz;
    995   extern unsigned struct_scc_modem_sz;
    996   extern unsigned struct_scc_stat_sz;
    997   extern unsigned struct_serial_multiport_struct_sz;
    998   extern unsigned struct_serial_struct_sz;
    999   extern unsigned struct_sockaddr_ax25_sz;
   1000   extern unsigned struct_unimapdesc_sz;
   1001   extern unsigned struct_unimapinit_sz;
   1002 #endif  // SANITIZER_LINUX && !SANITIZER_ANDROID
   1003 
   1004   extern const unsigned long __sanitizer_bufsiz;
   1005 
   1006 #if SANITIZER_LINUX && !SANITIZER_ANDROID
   1007   extern unsigned struct_audio_buf_info_sz;
   1008   extern unsigned struct_ppp_stats_sz;
   1009 #endif  // (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
   1010 
   1011 #if !SANITIZER_ANDROID && !SANITIZER_MAC
   1012   extern unsigned struct_sioc_sg_req_sz;
   1013   extern unsigned struct_sioc_vif_req_sz;
   1014 #endif
   1015 
   1016   // ioctl request identifiers
   1017 
   1018   // A special value to mark ioctls that are not present on the target platform,
   1019   // when it can not be determined without including any system headers.
   1020   extern const unsigned IOCTL_NOT_PRESENT;
   1021 
   1022   extern unsigned IOCTL_FIOASYNC;
   1023   extern unsigned IOCTL_FIOCLEX;
   1024   extern unsigned IOCTL_FIOGETOWN;
   1025   extern unsigned IOCTL_FIONBIO;
   1026   extern unsigned IOCTL_FIONCLEX;
   1027   extern unsigned IOCTL_FIOSETOWN;
   1028   extern unsigned IOCTL_SIOCADDMULTI;
   1029   extern unsigned IOCTL_SIOCATMARK;
   1030   extern unsigned IOCTL_SIOCDELMULTI;
   1031   extern unsigned IOCTL_SIOCGIFADDR;
   1032   extern unsigned IOCTL_SIOCGIFBRDADDR;
   1033   extern unsigned IOCTL_SIOCGIFCONF;
   1034   extern unsigned IOCTL_SIOCGIFDSTADDR;
   1035   extern unsigned IOCTL_SIOCGIFFLAGS;
   1036   extern unsigned IOCTL_SIOCGIFMETRIC;
   1037   extern unsigned IOCTL_SIOCGIFMTU;
   1038   extern unsigned IOCTL_SIOCGIFNETMASK;
   1039   extern unsigned IOCTL_SIOCGPGRP;
   1040   extern unsigned IOCTL_SIOCSIFADDR;
   1041   extern unsigned IOCTL_SIOCSIFBRDADDR;
   1042   extern unsigned IOCTL_SIOCSIFDSTADDR;
   1043   extern unsigned IOCTL_SIOCSIFFLAGS;
   1044   extern unsigned IOCTL_SIOCSIFMETRIC;
   1045   extern unsigned IOCTL_SIOCSIFMTU;
   1046   extern unsigned IOCTL_SIOCSIFNETMASK;
   1047   extern unsigned IOCTL_SIOCSPGRP;
   1048   extern unsigned IOCTL_TIOCCONS;
   1049   extern unsigned IOCTL_TIOCEXCL;
   1050   extern unsigned IOCTL_TIOCGETD;
   1051   extern unsigned IOCTL_TIOCGPGRP;
   1052   extern unsigned IOCTL_TIOCGWINSZ;
   1053   extern unsigned IOCTL_TIOCMBIC;
   1054   extern unsigned IOCTL_TIOCMBIS;
   1055   extern unsigned IOCTL_TIOCMGET;
   1056   extern unsigned IOCTL_TIOCMSET;
   1057   extern unsigned IOCTL_TIOCNOTTY;
   1058   extern unsigned IOCTL_TIOCNXCL;
   1059   extern unsigned IOCTL_TIOCOUTQ;
   1060   extern unsigned IOCTL_TIOCPKT;
   1061   extern unsigned IOCTL_TIOCSCTTY;
   1062   extern unsigned IOCTL_TIOCSETD;
   1063   extern unsigned IOCTL_TIOCSPGRP;
   1064   extern unsigned IOCTL_TIOCSTI;
   1065   extern unsigned IOCTL_TIOCSWINSZ;
   1066 #if SANITIZER_LINUX && !SANITIZER_ANDROID
   1067   extern unsigned IOCTL_SIOCGETSGCNT;
   1068   extern unsigned IOCTL_SIOCGETVIFCNT;
   1069 #endif
   1070 #if SANITIZER_LINUX
   1071   extern unsigned IOCTL_EVIOCGABS;
   1072   extern unsigned IOCTL_EVIOCGBIT;
   1073   extern unsigned IOCTL_EVIOCGEFFECTS;
   1074   extern unsigned IOCTL_EVIOCGID;
   1075   extern unsigned IOCTL_EVIOCGKEY;
   1076   extern unsigned IOCTL_EVIOCGKEYCODE;
   1077   extern unsigned IOCTL_EVIOCGLED;
   1078   extern unsigned IOCTL_EVIOCGNAME;
   1079   extern unsigned IOCTL_EVIOCGPHYS;
   1080   extern unsigned IOCTL_EVIOCGRAB;
   1081   extern unsigned IOCTL_EVIOCGREP;
   1082   extern unsigned IOCTL_EVIOCGSND;
   1083   extern unsigned IOCTL_EVIOCGSW;
   1084   extern unsigned IOCTL_EVIOCGUNIQ;
   1085   extern unsigned IOCTL_EVIOCGVERSION;
   1086   extern unsigned IOCTL_EVIOCRMFF;
   1087   extern unsigned IOCTL_EVIOCSABS;
   1088   extern unsigned IOCTL_EVIOCSFF;
   1089   extern unsigned IOCTL_EVIOCSKEYCODE;
   1090   extern unsigned IOCTL_EVIOCSREP;
   1091   extern unsigned IOCTL_BLKFLSBUF;
   1092   extern unsigned IOCTL_BLKGETSIZE;
   1093   extern unsigned IOCTL_BLKRAGET;
   1094   extern unsigned IOCTL_BLKRASET;
   1095   extern unsigned IOCTL_BLKROGET;
   1096   extern unsigned IOCTL_BLKROSET;
   1097   extern unsigned IOCTL_BLKRRPART;
   1098   extern unsigned IOCTL_CDROMAUDIOBUFSIZ;
   1099   extern unsigned IOCTL_CDROMEJECT;
   1100   extern unsigned IOCTL_CDROMEJECT_SW;
   1101   extern unsigned IOCTL_CDROMMULTISESSION;
   1102   extern unsigned IOCTL_CDROMPAUSE;
   1103   extern unsigned IOCTL_CDROMPLAYMSF;
   1104   extern unsigned IOCTL_CDROMPLAYTRKIND;
   1105   extern unsigned IOCTL_CDROMREADAUDIO;
   1106   extern unsigned IOCTL_CDROMREADCOOKED;
   1107   extern unsigned IOCTL_CDROMREADMODE1;
   1108   extern unsigned IOCTL_CDROMREADMODE2;
   1109   extern unsigned IOCTL_CDROMREADRAW;
   1110   extern unsigned IOCTL_CDROMREADTOCENTRY;
   1111   extern unsigned IOCTL_CDROMREADTOCHDR;
   1112   extern unsigned IOCTL_CDROMRESET;
   1113   extern unsigned IOCTL_CDROMRESUME;
   1114   extern unsigned IOCTL_CDROMSEEK;
   1115   extern unsigned IOCTL_CDROMSTART;
   1116   extern unsigned IOCTL_CDROMSTOP;
   1117   extern unsigned IOCTL_CDROMSUBCHNL;
   1118   extern unsigned IOCTL_CDROMVOLCTRL;
   1119   extern unsigned IOCTL_CDROMVOLREAD;
   1120   extern unsigned IOCTL_CDROM_GET_UPC;
   1121   extern unsigned IOCTL_FDCLRPRM;
   1122   extern unsigned IOCTL_FDDEFPRM;
   1123   extern unsigned IOCTL_FDFLUSH;
   1124   extern unsigned IOCTL_FDFMTBEG;
   1125   extern unsigned IOCTL_FDFMTEND;
   1126   extern unsigned IOCTL_FDFMTTRK;
   1127   extern unsigned IOCTL_FDGETDRVPRM;
   1128   extern unsigned IOCTL_FDGETDRVSTAT;
   1129   extern unsigned IOCTL_FDGETDRVTYP;
   1130   extern unsigned IOCTL_FDGETFDCSTAT;
   1131   extern unsigned IOCTL_FDGETMAXERRS;
   1132   extern unsigned IOCTL_FDGETPRM;
   1133   extern unsigned IOCTL_FDMSGOFF;
   1134   extern unsigned IOCTL_FDMSGON;
   1135   extern unsigned IOCTL_FDPOLLDRVSTAT;
   1136   extern unsigned IOCTL_FDRAWCMD;
   1137   extern unsigned IOCTL_FDRESET;
   1138   extern unsigned IOCTL_FDSETDRVPRM;
   1139   extern unsigned IOCTL_FDSETEMSGTRESH;
   1140   extern unsigned IOCTL_FDSETMAXERRS;
   1141   extern unsigned IOCTL_FDSETPRM;
   1142   extern unsigned IOCTL_FDTWADDLE;
   1143   extern unsigned IOCTL_FDWERRORCLR;
   1144   extern unsigned IOCTL_FDWERRORGET;
   1145   extern unsigned IOCTL_HDIO_DRIVE_CMD;
   1146   extern unsigned IOCTL_HDIO_GETGEO;
   1147   extern unsigned IOCTL_HDIO_GET_32BIT;
   1148   extern unsigned IOCTL_HDIO_GET_DMA;
   1149   extern unsigned IOCTL_HDIO_GET_IDENTITY;
   1150   extern unsigned IOCTL_HDIO_GET_KEEPSETTINGS;
   1151   extern unsigned IOCTL_HDIO_GET_MULTCOUNT;
   1152   extern unsigned IOCTL_HDIO_GET_NOWERR;
   1153   extern unsigned IOCTL_HDIO_GET_UNMASKINTR;
   1154   extern unsigned IOCTL_HDIO_SET_32BIT;
   1155   extern unsigned IOCTL_HDIO_SET_DMA;
   1156   extern unsigned IOCTL_HDIO_SET_KEEPSETTINGS;
   1157   extern unsigned IOCTL_HDIO_SET_MULTCOUNT;
   1158   extern unsigned IOCTL_HDIO_SET_NOWERR;
   1159   extern unsigned IOCTL_HDIO_SET_UNMASKINTR;
   1160   extern unsigned IOCTL_MTIOCPOS;
   1161   extern unsigned IOCTL_PPPIOCGASYNCMAP;
   1162   extern unsigned IOCTL_PPPIOCGDEBUG;
   1163   extern unsigned IOCTL_PPPIOCGFLAGS;
   1164   extern unsigned IOCTL_PPPIOCGUNIT;
   1165   extern unsigned IOCTL_PPPIOCGXASYNCMAP;
   1166   extern unsigned IOCTL_PPPIOCSASYNCMAP;
   1167   extern unsigned IOCTL_PPPIOCSDEBUG;
   1168   extern unsigned IOCTL_PPPIOCSFLAGS;
   1169   extern unsigned IOCTL_PPPIOCSMAXCID;
   1170   extern unsigned IOCTL_PPPIOCSMRU;
   1171   extern unsigned IOCTL_PPPIOCSXASYNCMAP;
   1172   extern unsigned IOCTL_SIOCDARP;
   1173   extern unsigned IOCTL_SIOCDRARP;
   1174   extern unsigned IOCTL_SIOCGARP;
   1175   extern unsigned IOCTL_SIOCGIFENCAP;
   1176   extern unsigned IOCTL_SIOCGIFHWADDR;
   1177   extern unsigned IOCTL_SIOCGIFMAP;
   1178   extern unsigned IOCTL_SIOCGIFMEM;
   1179   extern unsigned IOCTL_SIOCGIFNAME;
   1180   extern unsigned IOCTL_SIOCGIFSLAVE;
   1181   extern unsigned IOCTL_SIOCGRARP;
   1182   extern unsigned IOCTL_SIOCGSTAMP;
   1183   extern unsigned IOCTL_SIOCSARP;
   1184   extern unsigned IOCTL_SIOCSIFENCAP;
   1185   extern unsigned IOCTL_SIOCSIFHWADDR;
   1186   extern unsigned IOCTL_SIOCSIFLINK;
   1187   extern unsigned IOCTL_SIOCSIFMAP;
   1188   extern unsigned IOCTL_SIOCSIFMEM;
   1189   extern unsigned IOCTL_SIOCSIFSLAVE;
   1190   extern unsigned IOCTL_SIOCSRARP;
   1191   extern unsigned IOCTL_SNDCTL_COPR_HALT;
   1192   extern unsigned IOCTL_SNDCTL_COPR_LOAD;
   1193   extern unsigned IOCTL_SNDCTL_COPR_RCODE;
   1194   extern unsigned IOCTL_SNDCTL_COPR_RCVMSG;
   1195   extern unsigned IOCTL_SNDCTL_COPR_RDATA;
   1196   extern unsigned IOCTL_SNDCTL_COPR_RESET;
   1197   extern unsigned IOCTL_SNDCTL_COPR_RUN;
   1198   extern unsigned IOCTL_SNDCTL_COPR_SENDMSG;
   1199   extern unsigned IOCTL_SNDCTL_COPR_WCODE;
   1200   extern unsigned IOCTL_SNDCTL_COPR_WDATA;
   1201   extern unsigned IOCTL_TCFLSH;
   1202   extern unsigned IOCTL_TCGETA;
   1203   extern unsigned IOCTL_TCGETS;
   1204   extern unsigned IOCTL_TCSBRK;
   1205   extern unsigned IOCTL_TCSBRKP;
   1206   extern unsigned IOCTL_TCSETA;
   1207   extern unsigned IOCTL_TCSETAF;
   1208   extern unsigned IOCTL_TCSETAW;
   1209   extern unsigned IOCTL_TCSETS;
   1210   extern unsigned IOCTL_TCSETSF;
   1211   extern unsigned IOCTL_TCSETSW;
   1212   extern unsigned IOCTL_TCXONC;
   1213   extern unsigned IOCTL_TIOCGLCKTRMIOS;
   1214   extern unsigned IOCTL_TIOCGSOFTCAR;
   1215   extern unsigned IOCTL_TIOCINQ;
   1216   extern unsigned IOCTL_TIOCLINUX;
   1217   extern unsigned IOCTL_TIOCSERCONFIG;
   1218   extern unsigned IOCTL_TIOCSERGETLSR;
   1219   extern unsigned IOCTL_TIOCSERGWILD;
   1220   extern unsigned IOCTL_TIOCSERSWILD;
   1221   extern unsigned IOCTL_TIOCSLCKTRMIOS;
   1222   extern unsigned IOCTL_TIOCSSOFTCAR;
   1223   extern unsigned IOCTL_VT_DISALLOCATE;
   1224   extern unsigned IOCTL_VT_GETSTATE;
   1225   extern unsigned IOCTL_VT_RESIZE;
   1226   extern unsigned IOCTL_VT_RESIZEX;
   1227   extern unsigned IOCTL_VT_SENDSIG;
   1228   extern unsigned IOCTL_MTIOCGET;
   1229   extern unsigned IOCTL_MTIOCTOP;
   1230   extern unsigned IOCTL_SIOCADDRT;
   1231   extern unsigned IOCTL_SIOCDELRT;
   1232   extern unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE;
   1233   extern unsigned IOCTL_SNDCTL_DSP_GETFMTS;
   1234   extern unsigned IOCTL_SNDCTL_DSP_NONBLOCK;
   1235   extern unsigned IOCTL_SNDCTL_DSP_POST;
   1236   extern unsigned IOCTL_SNDCTL_DSP_RESET;
   1237   extern unsigned IOCTL_SNDCTL_DSP_SETFMT;
   1238   extern unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT;
   1239   extern unsigned IOCTL_SNDCTL_DSP_SPEED;
   1240   extern unsigned IOCTL_SNDCTL_DSP_STEREO;
   1241   extern unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE;
   1242   extern unsigned IOCTL_SNDCTL_DSP_SYNC;
   1243   extern unsigned IOCTL_SNDCTL_FM_4OP_ENABLE;
   1244   extern unsigned IOCTL_SNDCTL_FM_LOAD_INSTR;
   1245   extern unsigned IOCTL_SNDCTL_MIDI_INFO;
   1246   extern unsigned IOCTL_SNDCTL_MIDI_PRETIME;
   1247   extern unsigned IOCTL_SNDCTL_SEQ_CTRLRATE;
   1248   extern unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT;
   1249   extern unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT;
   1250   extern unsigned IOCTL_SNDCTL_SEQ_NRMIDIS;
   1251   extern unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS;
   1252   extern unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND;
   1253   extern unsigned IOCTL_SNDCTL_SEQ_PANIC;
   1254   extern unsigned IOCTL_SNDCTL_SEQ_PERCMODE;
   1255   extern unsigned IOCTL_SNDCTL_SEQ_RESET;
   1256   extern unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES;
   1257   extern unsigned IOCTL_SNDCTL_SEQ_SYNC;
   1258   extern unsigned IOCTL_SNDCTL_SEQ_TESTMIDI;
   1259   extern unsigned IOCTL_SNDCTL_SEQ_THRESHOLD;
   1260   extern unsigned IOCTL_SNDCTL_SYNTH_INFO;
   1261   extern unsigned IOCTL_SNDCTL_SYNTH_MEMAVL;
   1262   extern unsigned IOCTL_SNDCTL_TMR_CONTINUE;
   1263   extern unsigned IOCTL_SNDCTL_TMR_METRONOME;
   1264   extern unsigned IOCTL_SNDCTL_TMR_SELECT;
   1265   extern unsigned IOCTL_SNDCTL_TMR_SOURCE;
   1266   extern unsigned IOCTL_SNDCTL_TMR_START;
   1267   extern unsigned IOCTL_SNDCTL_TMR_STOP;
   1268   extern unsigned IOCTL_SNDCTL_TMR_TEMPO;
   1269   extern unsigned IOCTL_SNDCTL_TMR_TIMEBASE;
   1270   extern unsigned IOCTL_SOUND_MIXER_READ_ALTPCM;
   1271   extern unsigned IOCTL_SOUND_MIXER_READ_BASS;
   1272   extern unsigned IOCTL_SOUND_MIXER_READ_CAPS;
   1273   extern unsigned IOCTL_SOUND_MIXER_READ_CD;
   1274   extern unsigned IOCTL_SOUND_MIXER_READ_DEVMASK;
   1275   extern unsigned IOCTL_SOUND_MIXER_READ_ENHANCE;
   1276   extern unsigned IOCTL_SOUND_MIXER_READ_IGAIN;
   1277   extern unsigned IOCTL_SOUND_MIXER_READ_IMIX;
   1278   extern unsigned IOCTL_SOUND_MIXER_READ_LINE1;
   1279   extern unsigned IOCTL_SOUND_MIXER_READ_LINE2;
   1280   extern unsigned IOCTL_SOUND_MIXER_READ_LINE3;
   1281   extern unsigned IOCTL_SOUND_MIXER_READ_LINE;
   1282   extern unsigned IOCTL_SOUND_MIXER_READ_LOUD;
   1283   extern unsigned IOCTL_SOUND_MIXER_READ_MIC;
   1284   extern unsigned IOCTL_SOUND_MIXER_READ_MUTE;
   1285   extern unsigned IOCTL_SOUND_MIXER_READ_OGAIN;
   1286   extern unsigned IOCTL_SOUND_MIXER_READ_PCM;
   1287   extern unsigned IOCTL_SOUND_MIXER_READ_RECLEV;
   1288   extern unsigned IOCTL_SOUND_MIXER_READ_RECMASK;
   1289   extern unsigned IOCTL_SOUND_MIXER_READ_RECSRC;
   1290   extern unsigned IOCTL_SOUND_MIXER_READ_SPEAKER;
   1291   extern unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS;
   1292   extern unsigned IOCTL_SOUND_MIXER_READ_SYNTH;
   1293   extern unsigned IOCTL_SOUND_MIXER_READ_TREBLE;
   1294   extern unsigned IOCTL_SOUND_MIXER_READ_VOLUME;
   1295   extern unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM;
   1296   extern unsigned IOCTL_SOUND_MIXER_WRITE_BASS;
   1297   extern unsigned IOCTL_SOUND_MIXER_WRITE_CD;
   1298   extern unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE;
   1299   extern unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN;
   1300   extern unsigned IOCTL_SOUND_MIXER_WRITE_IMIX;
   1301   extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE1;
   1302   extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE2;
   1303   extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE3;
   1304   extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE;
   1305   extern unsigned IOCTL_SOUND_MIXER_WRITE_LOUD;
   1306   extern unsigned IOCTL_SOUND_MIXER_WRITE_MIC;
   1307   extern unsigned IOCTL_SOUND_MIXER_WRITE_MUTE;
   1308   extern unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN;
   1309   extern unsigned IOCTL_SOUND_MIXER_WRITE_PCM;
   1310   extern unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV;
   1311   extern unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC;
   1312   extern unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER;
   1313   extern unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH;
   1314   extern unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE;
   1315   extern unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME;
   1316   extern unsigned IOCTL_SOUND_PCM_READ_BITS;
   1317   extern unsigned IOCTL_SOUND_PCM_READ_CHANNELS;
   1318   extern unsigned IOCTL_SOUND_PCM_READ_FILTER;
   1319   extern unsigned IOCTL_SOUND_PCM_READ_RATE;
   1320   extern unsigned IOCTL_SOUND_PCM_WRITE_CHANNELS;
   1321   extern unsigned IOCTL_SOUND_PCM_WRITE_FILTER;
   1322   extern unsigned IOCTL_VT_ACTIVATE;
   1323   extern unsigned IOCTL_VT_GETMODE;
   1324   extern unsigned IOCTL_VT_OPENQRY;
   1325   extern unsigned IOCTL_VT_RELDISP;
   1326   extern unsigned IOCTL_VT_SETMODE;
   1327   extern unsigned IOCTL_VT_WAITACTIVE;
   1328 #endif  // SANITIZER_LINUX
   1329 
   1330 #if SANITIZER_LINUX && !SANITIZER_ANDROID
   1331   extern unsigned IOCTL_CYGETDEFTHRESH;
   1332   extern unsigned IOCTL_CYGETDEFTIMEOUT;
   1333   extern unsigned IOCTL_CYGETMON;
   1334   extern unsigned IOCTL_CYGETTHRESH;
   1335   extern unsigned IOCTL_CYGETTIMEOUT;
   1336   extern unsigned IOCTL_CYSETDEFTHRESH;
   1337   extern unsigned IOCTL_CYSETDEFTIMEOUT;
   1338   extern unsigned IOCTL_CYSETTHRESH;
   1339   extern unsigned IOCTL_CYSETTIMEOUT;
   1340   extern unsigned IOCTL_EQL_EMANCIPATE;
   1341   extern unsigned IOCTL_EQL_ENSLAVE;
   1342   extern unsigned IOCTL_EQL_GETMASTRCFG;
   1343   extern unsigned IOCTL_EQL_GETSLAVECFG;
   1344   extern unsigned IOCTL_EQL_SETMASTRCFG;
   1345   extern unsigned IOCTL_EQL_SETSLAVECFG;
   1346   extern unsigned IOCTL_EVIOCGKEYCODE_V2;
   1347   extern unsigned IOCTL_EVIOCGPROP;
   1348   extern unsigned IOCTL_EVIOCSKEYCODE_V2;
   1349   extern unsigned IOCTL_FS_IOC_GETFLAGS;
   1350   extern unsigned IOCTL_FS_IOC_GETVERSION;
   1351   extern unsigned IOCTL_FS_IOC_SETFLAGS;
   1352   extern unsigned IOCTL_FS_IOC_SETVERSION;
   1353   extern unsigned IOCTL_GIO_CMAP;
   1354   extern unsigned IOCTL_GIO_FONT;
   1355   extern unsigned IOCTL_GIO_UNIMAP;
   1356   extern unsigned IOCTL_GIO_UNISCRNMAP;
   1357   extern unsigned IOCTL_KDADDIO;
   1358   extern unsigned IOCTL_KDDELIO;
   1359   extern unsigned IOCTL_KDGETKEYCODE;
   1360   extern unsigned IOCTL_KDGKBDIACR;
   1361   extern unsigned IOCTL_KDGKBENT;
   1362   extern unsigned IOCTL_KDGKBLED;
   1363   extern unsigned IOCTL_KDGKBMETA;
   1364   extern unsigned IOCTL_KDGKBSENT;
   1365   extern unsigned IOCTL_KDMAPDISP;
   1366   extern unsigned IOCTL_KDSETKEYCODE;
   1367   extern unsigned IOCTL_KDSIGACCEPT;
   1368   extern unsigned IOCTL_KDSKBDIACR;
   1369   extern unsigned IOCTL_KDSKBENT;
   1370   extern unsigned IOCTL_KDSKBLED;
   1371   extern unsigned IOCTL_KDSKBMETA;
   1372   extern unsigned IOCTL_KDSKBSENT;
   1373   extern unsigned IOCTL_KDUNMAPDISP;
   1374   extern unsigned IOCTL_LPABORT;
   1375   extern unsigned IOCTL_LPABORTOPEN;
   1376   extern unsigned IOCTL_LPCAREFUL;
   1377   extern unsigned IOCTL_LPCHAR;
   1378   extern unsigned IOCTL_LPGETIRQ;
   1379   extern unsigned IOCTL_LPGETSTATUS;
   1380   extern unsigned IOCTL_LPRESET;
   1381   extern unsigned IOCTL_LPSETIRQ;
   1382   extern unsigned IOCTL_LPTIME;
   1383   extern unsigned IOCTL_LPWAIT;
   1384   extern unsigned IOCTL_MTIOCGETCONFIG;
   1385   extern unsigned IOCTL_MTIOCSETCONFIG;
   1386   extern unsigned IOCTL_PIO_CMAP;
   1387   extern unsigned IOCTL_PIO_FONT;
   1388   extern unsigned IOCTL_PIO_UNIMAP;
   1389   extern unsigned IOCTL_PIO_UNIMAPCLR;
   1390   extern unsigned IOCTL_PIO_UNISCRNMAP;
   1391   extern unsigned IOCTL_SCSI_IOCTL_GET_IDLUN;
   1392   extern unsigned IOCTL_SCSI_IOCTL_PROBE_HOST;
   1393   extern unsigned IOCTL_SCSI_IOCTL_TAGGED_DISABLE;
   1394   extern unsigned IOCTL_SCSI_IOCTL_TAGGED_ENABLE;
   1395   extern unsigned IOCTL_SIOCAIPXITFCRT;
   1396   extern unsigned IOCTL_SIOCAIPXPRISLT;
   1397   extern unsigned IOCTL_SIOCAX25ADDUID;
   1398   extern unsigned IOCTL_SIOCAX25DELUID;
   1399   extern unsigned IOCTL_SIOCAX25GETPARMS;
   1400   extern unsigned IOCTL_SIOCAX25GETUID;
   1401   extern unsigned IOCTL_SIOCAX25NOUID;
   1402   extern unsigned IOCTL_SIOCAX25SETPARMS;
   1403   extern unsigned IOCTL_SIOCDEVPLIP;
   1404   extern unsigned IOCTL_SIOCIPXCFGDATA;
   1405   extern unsigned IOCTL_SIOCNRDECOBS;
   1406   extern unsigned IOCTL_SIOCNRGETPARMS;
   1407   extern unsigned IOCTL_SIOCNRRTCTL;
   1408   extern unsigned IOCTL_SIOCNRSETPARMS;
   1409   extern unsigned IOCTL_SNDCTL_DSP_GETISPACE;
   1410   extern unsigned IOCTL_SNDCTL_DSP_GETOSPACE;
   1411   extern unsigned IOCTL_TIOCGSERIAL;
   1412   extern unsigned IOCTL_TIOCSERGETMULTI;
   1413   extern unsigned IOCTL_TIOCSERSETMULTI;
   1414   extern unsigned IOCTL_TIOCSSERIAL;
   1415   extern unsigned IOCTL_GIO_SCRNMAP;
   1416   extern unsigned IOCTL_KDDISABIO;
   1417   extern unsigned IOCTL_KDENABIO;
   1418   extern unsigned IOCTL_KDGETLED;
   1419   extern unsigned IOCTL_KDGETMODE;
   1420   extern unsigned IOCTL_KDGKBMODE;
   1421   extern unsigned IOCTL_KDGKBTYPE;
   1422   extern unsigned IOCTL_KDMKTONE;
   1423   extern unsigned IOCTL_KDSETLED;
   1424   extern unsigned IOCTL_KDSETMODE;
   1425   extern unsigned IOCTL_KDSKBMODE;
   1426   extern unsigned IOCTL_KIOCSOUND;
   1427   extern unsigned IOCTL_PIO_SCRNMAP;
   1428 #endif
   1429 
   1430   extern const int si_SEGV_MAPERR;
   1431   extern const int si_SEGV_ACCERR;
   1432 }  // namespace __sanitizer
   1433 
   1434 #define CHECK_TYPE_SIZE(TYPE) \
   1435   COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
   1436 
   1437 #define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
   1438   COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \
   1439                  sizeof(((CLASS *) NULL)->MEMBER));                \
   1440   COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) ==          \
   1441                  offsetof(CLASS, MEMBER))
   1442 
   1443 // For sigaction, which is a function and struct at the same time,
   1444 // and thus requires explicit "struct" in sizeof() expression.
   1445 #define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
   1446   COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \
   1447                  sizeof(((struct CLASS *) NULL)->MEMBER));                \
   1448   COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) ==          \
   1449                  offsetof(struct CLASS, MEMBER))
   1450 
   1451 #define SIGACTION_SYMNAME sigaction
   1452 
   1453 #endif  // SANITIZER_LINUX || SANITIZER_MAC
   1454 
   1455 #endif
   1456