sanitizer_platform_limits_solaris.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. //===-- sanitizer_platform_limits_solaris.h -------------------------------===//
  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 Solaris data structures.
  12. //===----------------------------------------------------------------------===//
  13. #ifndef SANITIZER_PLATFORM_LIMITS_SOLARIS_H
  14. #define SANITIZER_PLATFORM_LIMITS_SOLARIS_H
  15. #if SANITIZER_SOLARIS
  16. #include "sanitizer_internal_defs.h"
  17. #include "sanitizer_platform.h"
  18. namespace __sanitizer {
  19. extern unsigned struct_utsname_sz;
  20. extern unsigned struct_stat_sz;
  21. extern unsigned struct_stat64_sz;
  22. extern unsigned struct_rusage_sz;
  23. extern unsigned siginfo_t_sz;
  24. extern unsigned struct_itimerval_sz;
  25. extern unsigned pthread_t_sz;
  26. extern unsigned pthread_mutex_t_sz;
  27. extern unsigned pthread_cond_t_sz;
  28. extern unsigned pid_t_sz;
  29. extern unsigned timeval_sz;
  30. extern unsigned uid_t_sz;
  31. extern unsigned gid_t_sz;
  32. extern unsigned mbstate_t_sz;
  33. extern unsigned struct_timezone_sz;
  34. extern unsigned struct_tms_sz;
  35. extern unsigned struct_itimerspec_sz;
  36. extern unsigned struct_sigevent_sz;
  37. extern unsigned struct_stack_t_sz;
  38. extern unsigned struct_sched_param_sz;
  39. extern unsigned struct_statfs64_sz;
  40. extern unsigned struct_statfs_sz;
  41. extern unsigned struct_sockaddr_sz;
  42. extern unsigned ucontext_t_sz;
  43. extern unsigned struct_timespec_sz;
  44. extern unsigned struct_rlimit_sz;
  45. extern unsigned struct_utimbuf_sz;
  46. struct __sanitizer_sem_t {
  47. //u64 data[6];
  48. u32 sem_count;
  49. u16 sem_type;
  50. u16 sem_magic;
  51. u64 sem_pad1[3];
  52. u64 sem_pad2[2];
  53. };
  54. struct __sanitizer_ipc_perm {
  55. unsigned int uid; // uid_t
  56. unsigned int gid; // gid_t
  57. unsigned int cuid; // uid_t
  58. unsigned int cgid; // gid_t
  59. unsigned int mode; // mode_t
  60. unsigned int seq; // uint_t
  61. int key; // key_t
  62. #if !defined(_LP64)
  63. int pad[4];
  64. #endif
  65. };
  66. struct __sanitizer_shmid_ds {
  67. __sanitizer_ipc_perm shm_perm;
  68. unsigned long shm_segsz; // size_t
  69. unsigned long shm_flags; // uintptr_t
  70. unsigned short shm_lkcnt; // ushort_t
  71. int shm_lpid; // pid_t
  72. int shm_cpid; // pid_t
  73. unsigned long shm_nattch; // shmatt_t
  74. unsigned long shm_cnattch; // ulong_t
  75. #if defined(_LP64)
  76. long shm_atime; // time_t
  77. long shm_dtime;
  78. long shm_ctime;
  79. void *shm_amp;
  80. u64 shm_gransize; // uint64_t
  81. u64 shm_allocated; // uint64_t
  82. u64 shm_pad4[1]; // int64_t
  83. #else
  84. long shm_atime; // time_t
  85. int shm_pad1; // int32_t
  86. long shm_dtime; // time_t
  87. int shm_pad2; // int32_t
  88. long shm_ctime; // time_t
  89. void *shm_amp;
  90. u64 shm_gransize; // uint64_t
  91. u64 shm_allocated; // uint64_t
  92. #endif
  93. };
  94. extern unsigned struct_statvfs_sz;
  95. #if SANITIZER_SOLARIS32
  96. extern unsigned struct_statvfs64_sz;
  97. #endif
  98. struct __sanitizer_iovec {
  99. void *iov_base;
  100. uptr iov_len;
  101. };
  102. struct __sanitizer_ifaddrs {
  103. struct __sanitizer_ifaddrs *ifa_next;
  104. char *ifa_name;
  105. u64 ifa_flags; // uint64_t
  106. void *ifa_addr; // (struct sockaddr *)
  107. void *ifa_netmask; // (struct sockaddr *)
  108. // This is a union on Linux.
  109. # ifdef ifa_dstaddr
  110. # undef ifa_dstaddr
  111. # endif
  112. void *ifa_dstaddr; // (struct sockaddr *)
  113. void *ifa_data;
  114. };
  115. typedef unsigned __sanitizer_pthread_key_t;
  116. struct __sanitizer_XDR {
  117. int x_op;
  118. void *x_ops;
  119. uptr x_public;
  120. uptr x_private;
  121. uptr x_base;
  122. unsigned x_handy;
  123. };
  124. const int __sanitizer_XDR_ENCODE = 0;
  125. const int __sanitizer_XDR_DECODE = 1;
  126. const int __sanitizer_XDR_FREE = 2;
  127. struct __sanitizer_passwd {
  128. char *pw_name;
  129. char *pw_passwd;
  130. unsigned int pw_uid; // uid_t
  131. unsigned int pw_gid; // gid_t
  132. char *pw_age;
  133. char *pw_comment;
  134. char *pw_gecos;
  135. char *pw_dir;
  136. char *pw_shell;
  137. };
  138. struct __sanitizer_group {
  139. char *gr_name;
  140. char *gr_passwd;
  141. int gr_gid;
  142. char **gr_mem;
  143. };
  144. typedef long __sanitizer_time_t;
  145. typedef long __sanitizer_suseconds_t;
  146. struct __sanitizer_timeval {
  147. __sanitizer_time_t tv_sec;
  148. __sanitizer_suseconds_t tv_usec;
  149. };
  150. struct __sanitizer_itimerval {
  151. struct __sanitizer_timeval it_interval;
  152. struct __sanitizer_timeval it_value;
  153. };
  154. struct __sanitizer_timeb {
  155. __sanitizer_time_t time;
  156. unsigned short millitm;
  157. short timezone;
  158. short dstflag;
  159. };
  160. struct __sanitizer_ether_addr {
  161. u8 octet[6];
  162. };
  163. struct __sanitizer_tm {
  164. int tm_sec;
  165. int tm_min;
  166. int tm_hour;
  167. int tm_mday;
  168. int tm_mon;
  169. int tm_year;
  170. int tm_wday;
  171. int tm_yday;
  172. int tm_isdst;
  173. };
  174. struct __sanitizer_msghdr {
  175. void *msg_name;
  176. unsigned msg_namelen;
  177. struct __sanitizer_iovec *msg_iov;
  178. unsigned msg_iovlen;
  179. void *msg_control;
  180. unsigned msg_controllen;
  181. int msg_flags;
  182. };
  183. struct __sanitizer_cmsghdr {
  184. unsigned cmsg_len;
  185. int cmsg_level;
  186. int cmsg_type;
  187. };
  188. #if SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)
  189. struct __sanitizer_dirent {
  190. unsigned long long d_ino;
  191. long long d_off;
  192. unsigned short d_reclen;
  193. // more fields that we don't care about
  194. };
  195. #else
  196. struct __sanitizer_dirent {
  197. unsigned long d_ino;
  198. long d_off;
  199. unsigned short d_reclen;
  200. // more fields that we don't care about
  201. };
  202. #endif
  203. struct __sanitizer_dirent64 {
  204. unsigned long long d_ino;
  205. unsigned long long d_off;
  206. unsigned short d_reclen;
  207. // more fields that we don't care about
  208. };
  209. typedef long __sanitizer_clock_t;
  210. typedef int __sanitizer_clockid_t;
  211. // This thing depends on the platform. We are only interested in the upper
  212. // limit. Verified with a compiler assert in .cpp.
  213. union __sanitizer_pthread_attr_t {
  214. char size[128];
  215. void *align;
  216. };
  217. struct __sanitizer_sigset_t {
  218. // uint32_t * 4
  219. unsigned int __bits[4];
  220. };
  221. struct __sanitizer_siginfo {
  222. // The size is determined by looking at sizeof of real siginfo_t on linux.
  223. u64 opaque[128 / sizeof(u64)];
  224. };
  225. using __sanitizer_sighandler_ptr = void (*)(int sig);
  226. using __sanitizer_sigactionhandler_ptr =
  227. void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx);
  228. struct __sanitizer_sigaction {
  229. int sa_flags;
  230. union {
  231. __sanitizer_sigactionhandler_ptr sigaction;
  232. __sanitizer_sighandler_ptr handler;
  233. };
  234. __sanitizer_sigset_t sa_mask;
  235. #if !defined(_LP64)
  236. int sa_resv[2];
  237. #endif
  238. };
  239. struct __sanitizer_kernel_sigset_t {
  240. u8 sig[8];
  241. };
  242. struct __sanitizer_kernel_sigaction_t {
  243. union {
  244. void (*handler)(int signo);
  245. void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
  246. };
  247. unsigned long sa_flags;
  248. void (*sa_restorer)(void);
  249. __sanitizer_kernel_sigset_t sa_mask;
  250. };
  251. extern const uptr sig_ign;
  252. extern const uptr sig_dfl;
  253. extern const uptr sig_err;
  254. extern const uptr sa_siginfo;
  255. extern int af_inet;
  256. extern int af_inet6;
  257. uptr __sanitizer_in_addr_sz(int af);
  258. struct __sanitizer_dl_phdr_info {
  259. uptr dlpi_addr;
  260. const char *dlpi_name;
  261. const void *dlpi_phdr;
  262. short dlpi_phnum;
  263. };
  264. extern unsigned struct_ElfW_Phdr_sz;
  265. struct __sanitizer_addrinfo {
  266. int ai_flags;
  267. int ai_family;
  268. int ai_socktype;
  269. int ai_protocol;
  270. #if defined(__sparcv9)
  271. int _ai_pad;
  272. #endif
  273. unsigned ai_addrlen;
  274. char *ai_canonname;
  275. void *ai_addr;
  276. struct __sanitizer_addrinfo *ai_next;
  277. };
  278. struct __sanitizer_hostent {
  279. char *h_name;
  280. char **h_aliases;
  281. int h_addrtype;
  282. int h_length;
  283. char **h_addr_list;
  284. };
  285. struct __sanitizer_pollfd {
  286. int fd;
  287. short events;
  288. short revents;
  289. };
  290. typedef unsigned long __sanitizer_nfds_t;
  291. struct __sanitizer_glob_t {
  292. uptr gl_pathc;
  293. char **gl_pathv;
  294. uptr gl_offs;
  295. char **gl_pathp;
  296. int gl_pathn;
  297. };
  298. extern int glob_nomatch;
  299. extern int glob_altdirfunc;
  300. extern const int wordexp_wrde_dooffs;
  301. extern unsigned path_max;
  302. struct __sanitizer_wordexp_t {
  303. uptr we_wordc;
  304. char **we_wordv;
  305. uptr we_offs;
  306. char **we_wordp;
  307. int we_wordn;
  308. };
  309. typedef void __sanitizer_FILE;
  310. #define SANITIZER_HAS_STRUCT_FILE 0
  311. // This simplifies generic code
  312. #define struct_shminfo_sz -1
  313. #define struct_shm_info_sz -1
  314. #define shmctl_shm_stat -1
  315. #define shmctl_ipc_info -1
  316. #define shmctl_shm_info -1
  317. extern int shmctl_ipc_stat;
  318. extern unsigned struct_utmp_sz;
  319. extern unsigned struct_utmpx_sz;
  320. extern int map_fixed;
  321. // ioctl arguments
  322. struct __sanitizer_ifconf {
  323. int ifc_len;
  324. union {
  325. void *ifcu_req;
  326. } ifc_ifcu;
  327. };
  328. // <sys/ioccom.h>
  329. #define IOC_NRBITS 8
  330. #define IOC_TYPEBITS 8
  331. #define IOC_SIZEBITS 12
  332. #define IOC_DIRBITS 4
  333. #undef IOC_NONE
  334. #define IOC_NONE 2U // IOC_VOID
  335. #define IOC_READ 4U // IOC_OUT
  336. #define IOC_WRITE 8U // IOC_IN
  337. #define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
  338. #define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
  339. #define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
  340. #define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
  341. #define IOC_NRSHIFT 0
  342. #define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
  343. #define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
  344. #define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
  345. #define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
  346. #define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
  347. #define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)
  348. #if defined(__sparc__)
  349. // In sparc the 14 bits SIZE field overlaps with the
  350. // least significant bit of DIR, so either IOC_READ or
  351. // IOC_WRITE shall be 1 in order to get a non-zero SIZE.
  352. #define IOC_SIZE(nr) \
  353. ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
  354. #else
  355. #define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
  356. #endif
  357. extern unsigned struct_ifreq_sz;
  358. extern unsigned struct_termios_sz;
  359. extern unsigned struct_winsize_sz;
  360. extern unsigned struct_sioc_sg_req_sz;
  361. extern unsigned struct_sioc_vif_req_sz;
  362. // ioctl request identifiers
  363. // A special value to mark ioctls that are not present on the target platform,
  364. // when it can not be determined without including any system headers.
  365. extern const unsigned IOCTL_NOT_PRESENT;
  366. extern unsigned IOCTL_FIOASYNC;
  367. extern unsigned IOCTL_FIOCLEX;
  368. extern unsigned IOCTL_FIOGETOWN;
  369. extern unsigned IOCTL_FIONBIO;
  370. extern unsigned IOCTL_FIONCLEX;
  371. extern unsigned IOCTL_FIOSETOWN;
  372. extern unsigned IOCTL_SIOCADDMULTI;
  373. extern unsigned IOCTL_SIOCATMARK;
  374. extern unsigned IOCTL_SIOCDELMULTI;
  375. extern unsigned IOCTL_SIOCGIFADDR;
  376. extern unsigned IOCTL_SIOCGIFBRDADDR;
  377. extern unsigned IOCTL_SIOCGIFCONF;
  378. extern unsigned IOCTL_SIOCGIFDSTADDR;
  379. extern unsigned IOCTL_SIOCGIFFLAGS;
  380. extern unsigned IOCTL_SIOCGIFMETRIC;
  381. extern unsigned IOCTL_SIOCGIFMTU;
  382. extern unsigned IOCTL_SIOCGIFNETMASK;
  383. extern unsigned IOCTL_SIOCGPGRP;
  384. extern unsigned IOCTL_SIOCSIFADDR;
  385. extern unsigned IOCTL_SIOCSIFBRDADDR;
  386. extern unsigned IOCTL_SIOCSIFDSTADDR;
  387. extern unsigned IOCTL_SIOCSIFFLAGS;
  388. extern unsigned IOCTL_SIOCSIFMETRIC;
  389. extern unsigned IOCTL_SIOCSIFMTU;
  390. extern unsigned IOCTL_SIOCSIFNETMASK;
  391. extern unsigned IOCTL_SIOCSPGRP;
  392. extern unsigned IOCTL_TIOCEXCL;
  393. extern unsigned IOCTL_TIOCGETD;
  394. extern unsigned IOCTL_TIOCGPGRP;
  395. extern unsigned IOCTL_TIOCGWINSZ;
  396. extern unsigned IOCTL_TIOCMBIC;
  397. extern unsigned IOCTL_TIOCMBIS;
  398. extern unsigned IOCTL_TIOCMGET;
  399. extern unsigned IOCTL_TIOCMSET;
  400. extern unsigned IOCTL_TIOCNOTTY;
  401. extern unsigned IOCTL_TIOCNXCL;
  402. extern unsigned IOCTL_TIOCOUTQ;
  403. extern unsigned IOCTL_TIOCPKT;
  404. extern unsigned IOCTL_TIOCSCTTY;
  405. extern unsigned IOCTL_TIOCSETD;
  406. extern unsigned IOCTL_TIOCSPGRP;
  407. extern unsigned IOCTL_TIOCSTI;
  408. extern unsigned IOCTL_TIOCSWINSZ;
  409. extern unsigned IOCTL_MTIOCGET;
  410. extern unsigned IOCTL_MTIOCTOP;
  411. extern const int si_SEGV_MAPERR;
  412. extern const int si_SEGV_ACCERR;
  413. } // namespace __sanitizer
  414. #define CHECK_TYPE_SIZE(TYPE) \
  415. COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
  416. #define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \
  417. COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \
  418. sizeof(((CLASS *) NULL)->MEMBER)); \
  419. COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \
  420. offsetof(CLASS, MEMBER))
  421. // For sigaction, which is a function and struct at the same time,
  422. // and thus requires explicit "struct" in sizeof() expression.
  423. #define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \
  424. COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \
  425. sizeof(((struct CLASS *) NULL)->MEMBER)); \
  426. COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \
  427. offsetof(struct CLASS, MEMBER))
  428. #endif // SANITIZER_SOLARIS
  429. #endif