372 lines · cpp
1//===-- sanitizer_platform_limits_solaris.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-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a part of Sanitizer common code.10//11// Sizes and layouts of platform-specific Solaris data structures.12//===----------------------------------------------------------------------===//13 14#include "sanitizer_platform.h"15 16#if SANITIZER_SOLARIS17#include <arpa/inet.h>18#include <dirent.h>19#include <glob.h>20#include <grp.h>21#include <ifaddrs.h>22#include <limits.h>23#include <link.h>24#include <net/if.h>25#include <net/route.h>26#include <netdb.h>27#include <netinet/ip_mroute.h>28#include <poll.h>29#include <pthread.h>30#include <pwd.h>31#include <rpc/xdr.h>32#include <semaphore.h>33#include <signal.h>34#include <stddef.h>35#include <stdio.h>36#include <sys/ethernet.h>37#include <sys/filio.h>38#include <sys/ipc.h>39#include <sys/mman.h>40#include <sys/mount.h>41#include <sys/mtio.h>42#include <sys/ptyvar.h>43#include <sys/resource.h>44#include <sys/shm.h>45#include <sys/socket.h>46#include <sys/sockio.h>47#include <sys/stat.h>48#include <sys/statfs.h>49#include <sys/statvfs.h>50#include <sys/time.h>51#include <sys/timeb.h>52#include <sys/times.h>53#include <sys/types.h>54#include <sys/utsname.h>55#include <termios.h>56#include <time.h>57#include <utmp.h>58#include <utmpx.h>59#include <wchar.h>60#include <wordexp.h>61 62// Include these after system headers to avoid name clashes and ambiguities.63#include "sanitizer_internal_defs.h"64#include "sanitizer_platform_limits_solaris.h"65 66namespace __sanitizer {67 unsigned struct_utsname_sz = sizeof(struct utsname);68 unsigned struct_stat_sz = sizeof(struct stat);69 unsigned struct_stat64_sz = sizeof(struct stat64);70 unsigned struct_rusage_sz = sizeof(struct rusage);71 unsigned struct_tm_sz = sizeof(struct tm);72 unsigned struct_passwd_sz = sizeof(struct passwd);73 unsigned struct_group_sz = sizeof(struct group);74 unsigned siginfo_t_sz = sizeof(siginfo_t);75 unsigned struct_sigaction_sz = sizeof(struct sigaction);76 unsigned struct_stack_t_sz = sizeof(stack_t);77 unsigned struct_itimerval_sz = sizeof(struct itimerval);78 unsigned pthread_t_sz = sizeof(pthread_t);79 unsigned pthread_mutex_t_sz = sizeof(pthread_mutex_t);80 unsigned pthread_cond_t_sz = sizeof(pthread_cond_t);81 unsigned pid_t_sz = sizeof(pid_t);82 unsigned timeval_sz = sizeof(timeval);83 unsigned uid_t_sz = sizeof(uid_t);84 unsigned gid_t_sz = sizeof(gid_t);85 unsigned mbstate_t_sz = sizeof(mbstate_t);86 unsigned sigset_t_sz = sizeof(sigset_t);87 unsigned struct_timezone_sz = sizeof(struct timezone);88 unsigned struct_tms_sz = sizeof(struct tms);89 unsigned struct_sigevent_sz = sizeof(struct sigevent);90 unsigned struct_sched_param_sz = sizeof(struct sched_param);91 unsigned struct_statfs_sz = sizeof(struct statfs);92 unsigned struct_sockaddr_sz = sizeof(struct sockaddr);93 unsigned ucontext_t_sz(void *ctx) { return sizeof(ucontext_t); }94 unsigned struct_timespec_sz = sizeof(struct timespec);95#if SANITIZER_SOLARIS3296 unsigned struct_statvfs64_sz = sizeof(struct statvfs64);97#endif98 unsigned struct_statvfs_sz = sizeof(struct statvfs);99 100 const uptr sig_ign = (uptr)SIG_IGN;101 const uptr sig_dfl = (uptr)SIG_DFL;102 const uptr sig_err = (uptr)SIG_ERR;103 const uptr sa_siginfo = (uptr)SA_SIGINFO;104 105 int shmctl_ipc_stat = (int)IPC_STAT;106 107 unsigned struct_utmp_sz = sizeof(struct utmp);108 unsigned struct_utmpx_sz = sizeof(struct utmpx);109 110 int map_fixed = MAP_FIXED;111 112 int af_inet = (int)AF_INET;113 int af_inet6 = (int)AF_INET6;114 115 uptr __sanitizer_in_addr_sz(int af) {116 if (af == AF_INET)117 return sizeof(struct in_addr);118 else if (af == AF_INET6)119 return sizeof(struct in6_addr);120 else121 return 0;122 }123 124 unsigned struct_ElfW_Phdr_sz = sizeof(ElfW(Phdr));125 126 int glob_nomatch = GLOB_NOMATCH;127 const int wordexp_wrde_dooffs = WRDE_DOOFFS;128 129 unsigned path_max = PATH_MAX;130 131 // ioctl arguments132 unsigned struct_ifreq_sz = sizeof(struct ifreq);133 unsigned struct_termios_sz = sizeof(struct termios);134 unsigned struct_winsize_sz = sizeof(struct winsize);135 136 unsigned struct_sioc_sg_req_sz = sizeof(struct sioc_sg_req);137 unsigned struct_sioc_vif_req_sz = sizeof(struct sioc_vif_req);138 139 unsigned fpos_t_sz = sizeof(fpos_t);140 141 const unsigned IOCTL_NOT_PRESENT = 0;142 143 unsigned IOCTL_FIOASYNC = FIOASYNC;144 unsigned IOCTL_FIOCLEX = FIOCLEX;145 unsigned IOCTL_FIOGETOWN = FIOGETOWN;146 unsigned IOCTL_FIONBIO = FIONBIO;147 unsigned IOCTL_FIONCLEX = FIONCLEX;148 unsigned IOCTL_FIOSETOWN = FIOSETOWN;149 unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;150 unsigned IOCTL_SIOCATMARK = SIOCATMARK;151 unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;152 unsigned IOCTL_SIOCGIFADDR = SIOCGIFADDR;153 unsigned IOCTL_SIOCGIFBRDADDR = SIOCGIFBRDADDR;154 unsigned IOCTL_SIOCGIFCONF = SIOCGIFCONF;155 unsigned IOCTL_SIOCGIFDSTADDR = SIOCGIFDSTADDR;156 unsigned IOCTL_SIOCGIFFLAGS = SIOCGIFFLAGS;157 unsigned IOCTL_SIOCGIFMETRIC = SIOCGIFMETRIC;158 unsigned IOCTL_SIOCGIFMTU = SIOCGIFMTU;159 unsigned IOCTL_SIOCGIFNETMASK = SIOCGIFNETMASK;160 unsigned IOCTL_SIOCGPGRP = SIOCGPGRP;161 unsigned IOCTL_SIOCSIFADDR = SIOCSIFADDR;162 unsigned IOCTL_SIOCSIFBRDADDR = SIOCSIFBRDADDR;163 unsigned IOCTL_SIOCSIFDSTADDR = SIOCSIFDSTADDR;164 unsigned IOCTL_SIOCSIFFLAGS = SIOCSIFFLAGS;165 unsigned IOCTL_SIOCSIFMETRIC = SIOCSIFMETRIC;166 unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;167 unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;168 unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;169 unsigned IOCTL_TIOCEXCL = TIOCEXCL;170 unsigned IOCTL_TIOCGETD = TIOCGETD;171 unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;172 unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;173 unsigned IOCTL_TIOCMBIC = TIOCMBIC;174 unsigned IOCTL_TIOCMBIS = TIOCMBIS;175 unsigned IOCTL_TIOCMGET = TIOCMGET;176 unsigned IOCTL_TIOCMSET = TIOCMSET;177 unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;178 unsigned IOCTL_TIOCNXCL = TIOCNXCL;179 unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;180 unsigned IOCTL_TIOCPKT = TIOCPKT;181 unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;182 unsigned IOCTL_TIOCSETD = TIOCSETD;183 unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;184 unsigned IOCTL_TIOCSTI = TIOCSTI;185 unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;186 187 unsigned IOCTL_MTIOCGET = MTIOCGET;188 unsigned IOCTL_MTIOCTOP = MTIOCTOP;189 190 const int si_SEGV_MAPERR = SEGV_MAPERR;191 const int si_SEGV_ACCERR = SEGV_ACCERR;192} // namespace __sanitizer193 194using namespace __sanitizer;195 196COMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t));197 198COMPILER_CHECK(sizeof(socklen_t) == sizeof(unsigned));199CHECK_TYPE_SIZE(pthread_key_t);200 201// There are more undocumented fields in dl_phdr_info that we are not interested202// in.203COMPILER_CHECK(sizeof(__sanitizer_dl_phdr_info) <= sizeof(dl_phdr_info));204CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_addr);205CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_name);206CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phdr);207CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phnum);208 209// There are additional fields we are not interested in.210COMPILER_CHECK(sizeof(__sanitizer_glob_t) <= sizeof(glob_t));211CHECK_SIZE_AND_OFFSET(glob_t, gl_pathc);212CHECK_SIZE_AND_OFFSET(glob_t, gl_pathv);213CHECK_SIZE_AND_OFFSET(glob_t, gl_offs);214 215CHECK_TYPE_SIZE(addrinfo);216CHECK_SIZE_AND_OFFSET(addrinfo, ai_flags);217CHECK_SIZE_AND_OFFSET(addrinfo, ai_family);218CHECK_SIZE_AND_OFFSET(addrinfo, ai_socktype);219CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);220CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);221CHECK_SIZE_AND_OFFSET(addrinfo, ai_addrlen);222CHECK_SIZE_AND_OFFSET(addrinfo, ai_canonname);223CHECK_SIZE_AND_OFFSET(addrinfo, ai_addr);224 225CHECK_TYPE_SIZE(hostent);226CHECK_SIZE_AND_OFFSET(hostent, h_name);227CHECK_SIZE_AND_OFFSET(hostent, h_aliases);228CHECK_SIZE_AND_OFFSET(hostent, h_addrtype);229CHECK_SIZE_AND_OFFSET(hostent, h_length);230CHECK_SIZE_AND_OFFSET(hostent, h_addr_list);231 232CHECK_TYPE_SIZE(iovec);233CHECK_SIZE_AND_OFFSET(iovec, iov_base);234CHECK_SIZE_AND_OFFSET(iovec, iov_len);235 236CHECK_TYPE_SIZE(msghdr);237CHECK_SIZE_AND_OFFSET(msghdr, msg_name);238CHECK_SIZE_AND_OFFSET(msghdr, msg_namelen);239CHECK_SIZE_AND_OFFSET(msghdr, msg_iov);240CHECK_SIZE_AND_OFFSET(msghdr, msg_iovlen);241CHECK_SIZE_AND_OFFSET(msghdr, msg_control);242CHECK_SIZE_AND_OFFSET(msghdr, msg_controllen);243CHECK_SIZE_AND_OFFSET(msghdr, msg_flags);244 245CHECK_TYPE_SIZE(cmsghdr);246CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_len);247CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_level);248CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type);249 250COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));251CHECK_SIZE_AND_OFFSET(dirent, d_ino);252CHECK_SIZE_AND_OFFSET(dirent, d_off);253CHECK_SIZE_AND_OFFSET(dirent, d_reclen);254 255#if SANITIZER_SOLARIS32256COMPILER_CHECK(sizeof(__sanitizer_dirent64) <= sizeof(dirent64));257CHECK_SIZE_AND_OFFSET(dirent64, d_ino);258CHECK_SIZE_AND_OFFSET(dirent64, d_off);259CHECK_SIZE_AND_OFFSET(dirent64, d_reclen);260#endif261 262CHECK_TYPE_SIZE(ifconf);263CHECK_SIZE_AND_OFFSET(ifconf, ifc_len);264CHECK_SIZE_AND_OFFSET(ifconf, ifc_ifcu);265 266CHECK_TYPE_SIZE(pollfd);267CHECK_SIZE_AND_OFFSET(pollfd, fd);268CHECK_SIZE_AND_OFFSET(pollfd, events);269CHECK_SIZE_AND_OFFSET(pollfd, revents);270 271CHECK_TYPE_SIZE(nfds_t);272 273CHECK_TYPE_SIZE(sigset_t);274 275COMPILER_CHECK(sizeof(__sanitizer_sigaction) == sizeof(struct sigaction));276// Can't write checks for sa_handler and sa_sigaction due to them being277// preprocessor macros.278CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask);279CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_flags);280 281CHECK_TYPE_SIZE(wordexp_t);282CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);283CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);284CHECK_SIZE_AND_OFFSET(wordexp_t, we_offs);285 286CHECK_TYPE_SIZE(tm);287CHECK_SIZE_AND_OFFSET(tm, tm_sec);288CHECK_SIZE_AND_OFFSET(tm, tm_min);289CHECK_SIZE_AND_OFFSET(tm, tm_hour);290CHECK_SIZE_AND_OFFSET(tm, tm_mday);291CHECK_SIZE_AND_OFFSET(tm, tm_mon);292CHECK_SIZE_AND_OFFSET(tm, tm_year);293CHECK_SIZE_AND_OFFSET(tm, tm_wday);294CHECK_SIZE_AND_OFFSET(tm, tm_yday);295CHECK_SIZE_AND_OFFSET(tm, tm_isdst);296 297CHECK_TYPE_SIZE(ether_addr);298 299CHECK_TYPE_SIZE(ipc_perm);300CHECK_SIZE_AND_OFFSET(ipc_perm, key);301CHECK_SIZE_AND_OFFSET(ipc_perm, seq);302CHECK_SIZE_AND_OFFSET(ipc_perm, uid);303CHECK_SIZE_AND_OFFSET(ipc_perm, gid);304CHECK_SIZE_AND_OFFSET(ipc_perm, cuid);305CHECK_SIZE_AND_OFFSET(ipc_perm, cgid);306CHECK_SIZE_AND_OFFSET(ipc_perm, mode);307 308CHECK_TYPE_SIZE(shmid_ds);309CHECK_SIZE_AND_OFFSET(shmid_ds, shm_perm);310CHECK_SIZE_AND_OFFSET(shmid_ds, shm_segsz);311CHECK_SIZE_AND_OFFSET(shmid_ds, shm_atime);312CHECK_SIZE_AND_OFFSET(shmid_ds, shm_dtime);313CHECK_SIZE_AND_OFFSET(shmid_ds, shm_ctime);314CHECK_SIZE_AND_OFFSET(shmid_ds, shm_cpid);315CHECK_SIZE_AND_OFFSET(shmid_ds, shm_lpid);316CHECK_SIZE_AND_OFFSET(shmid_ds, shm_nattch);317 318CHECK_TYPE_SIZE(clock_t);319 320CHECK_TYPE_SIZE(ifaddrs);321CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);322CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);323CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_addr);324CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_netmask);325// Compare against the union, because we can't reach into the union in a326// compliant way.327#ifdef ifa_dstaddr328#undef ifa_dstaddr329#endif330COMPILER_CHECK(sizeof(((__sanitizer_ifaddrs *)nullptr)->ifa_dstaddr) ==331 sizeof(((ifaddrs *)nullptr)->ifa_ifu));332COMPILER_CHECK(offsetof(__sanitizer_ifaddrs, ifa_dstaddr) ==333 offsetof(ifaddrs, ifa_ifu));334CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_data);335 336CHECK_TYPE_SIZE(timeb);337CHECK_SIZE_AND_OFFSET(timeb, time);338CHECK_SIZE_AND_OFFSET(timeb, millitm);339CHECK_SIZE_AND_OFFSET(timeb, timezone);340CHECK_SIZE_AND_OFFSET(timeb, dstflag);341 342CHECK_TYPE_SIZE(passwd);343CHECK_SIZE_AND_OFFSET(passwd, pw_name);344CHECK_SIZE_AND_OFFSET(passwd, pw_passwd);345CHECK_SIZE_AND_OFFSET(passwd, pw_uid);346CHECK_SIZE_AND_OFFSET(passwd, pw_gid);347CHECK_SIZE_AND_OFFSET(passwd, pw_dir);348CHECK_SIZE_AND_OFFSET(passwd, pw_shell);349 350CHECK_SIZE_AND_OFFSET(passwd, pw_gecos);351 352CHECK_TYPE_SIZE(group);353CHECK_SIZE_AND_OFFSET(group, gr_name);354CHECK_SIZE_AND_OFFSET(group, gr_passwd);355CHECK_SIZE_AND_OFFSET(group, gr_gid);356CHECK_SIZE_AND_OFFSET(group, gr_mem);357 358CHECK_TYPE_SIZE(XDR);359CHECK_SIZE_AND_OFFSET(XDR, x_op);360CHECK_SIZE_AND_OFFSET(XDR, x_ops);361CHECK_SIZE_AND_OFFSET(XDR, x_public);362CHECK_SIZE_AND_OFFSET(XDR, x_private);363CHECK_SIZE_AND_OFFSET(XDR, x_base);364CHECK_SIZE_AND_OFFSET(XDR, x_handy);365COMPILER_CHECK(__sanitizer_XDR_ENCODE == XDR_ENCODE);366COMPILER_CHECK(__sanitizer_XDR_DECODE == XDR_DECODE);367COMPILER_CHECK(__sanitizer_XDR_FREE == XDR_FREE);368 369CHECK_TYPE_SIZE(sem_t);370 371#endif // SANITIZER_SOLARIS372