blob: d42df01a8d0b93d70321ebbc90da630fb7d06462 [file] [log] [blame]
Evgeniy Stepanov9358c582013-02-19 09:19:16 +00001//===-- sanitizer_platform_limits_posix.cc --------------------------------===//
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +00002//
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//
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000010// This file is a part of Sanitizer common code.
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000011//
12// Sizes and layouts of platform-specific POSIX data structures.
13//===----------------------------------------------------------------------===//
14
Evgeniy Stepanov24e13722013-03-19 14:33:38 +000015
16#include "sanitizer_platform.h"
17#if SANITIZER_LINUX || SANITIZER_MAC
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000018
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000019#include "sanitizer_internal_defs.h"
20#include "sanitizer_platform_limits_posix.h"
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000021
Evgeniy Stepanov9530eb72013-04-23 14:05:15 +000022#include <arpa/inet.h>
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000023#include <dirent.h>
Evgeniy Stepanov103a63e2013-04-23 12:01:20 +000024#include <grp.h>
Evgeniy Stepanov10fd3222013-03-13 09:01:40 +000025#include <pthread.h>
Evgeniy Stepanove4bdda52013-04-01 14:47:21 +000026#include <pwd.h>
27#include <signal.h>
Evgeniy Stepanov02284522013-05-17 13:30:48 +000028#include <stddef.h>
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000029#include <sys/utsname.h>
30#include <sys/types.h>
31#include <sys/stat.h>
Evgeniy Stepanov447ef192013-05-22 12:50:26 +000032#include <sys/socket.h>
Evgeniy Stepanove03345b2013-01-17 13:42:17 +000033#include <sys/time.h>
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000034#include <sys/resource.h>
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000035#include <sys/socket.h>
Evgeniy Stepanov447ef192013-05-22 12:50:26 +000036#include <netdb.h>
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000037#include <time.h>
38
Evgeniy Stepanov4fb04a82013-04-04 09:21:48 +000039#if !SANITIZER_ANDROID
40#include <sys/ucontext.h>
41#endif // !SANITIZER_ANDROID
42
Evgeniy Stepanov24e13722013-03-19 14:33:38 +000043#if SANITIZER_LINUX
Evgeniy Stepanov1aad6b52013-05-17 12:51:13 +000044#include <link.h>
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000045#include <sys/vfs.h>
46#include <sys/epoll.h>
Alexey Samsonov46f93952013-04-03 07:24:35 +000047#endif // SANITIZER_LINUX
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000048
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000049namespace __sanitizer {
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000050 unsigned struct_utsname_sz = sizeof(struct utsname);
51 unsigned struct_stat_sz = sizeof(struct stat);
52 unsigned struct_stat64_sz = sizeof(struct stat64);
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000053 unsigned struct_rusage_sz = sizeof(struct rusage);
54 unsigned struct_tm_sz = sizeof(struct tm);
Evgeniy Stepanove4bdda52013-04-01 14:47:21 +000055 unsigned struct_passwd_sz = sizeof(struct passwd);
Evgeniy Stepanov103a63e2013-04-23 12:01:20 +000056 unsigned struct_group_sz = sizeof(struct group);
Evgeniy Stepanov897a4ae2013-04-09 14:34:59 +000057 unsigned siginfo_t_sz = sizeof(siginfo_t);
Evgeniy Stepanove4bdda52013-04-01 14:47:21 +000058 unsigned struct_sigaction_sz = sizeof(struct sigaction);
59 unsigned struct_itimerval_sz = sizeof(struct itimerval);
60 unsigned pthread_t_sz = sizeof(pthread_t);
Evgeniy Stepanov4fb04a82013-04-04 09:21:48 +000061
62#if !SANITIZER_ANDROID
Evgeniy Stepanov07277022013-04-04 09:03:56 +000063 unsigned ucontext_t_sz = sizeof(ucontext_t);
Evgeniy Stepanov4fb04a82013-04-04 09:21:48 +000064#endif // !SANITIZER_ANDROID
Evgeniy Stepanov9358c582013-02-19 09:19:16 +000065
Evgeniy Stepanov24e13722013-03-19 14:33:38 +000066#if SANITIZER_LINUX
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000067 unsigned struct_rlimit_sz = sizeof(struct rlimit);
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000068 unsigned struct_dirent_sz = sizeof(struct dirent);
69 unsigned struct_statfs_sz = sizeof(struct statfs);
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000070 unsigned struct_epoll_event_sz = sizeof(struct epoll_event);
Evgeniy Stepanove4bdda52013-04-01 14:47:21 +000071 unsigned struct_timespec_sz = sizeof(struct timespec);
Alexey Samsonov46f93952013-04-03 07:24:35 +000072#endif // SANITIZER_LINUX
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +000073
Evgeniy Stepanov24e13722013-03-19 14:33:38 +000074#if SANITIZER_LINUX && !SANITIZER_ANDROID
Evgeniy Stepanove4cded92013-03-14 13:24:03 +000075 unsigned struct_dirent64_sz = sizeof(struct dirent64);
Evgeniy Stepanovb711ca62013-02-19 11:06:41 +000076 unsigned struct_rlimit64_sz = sizeof(struct rlimit64);
77 unsigned struct_statfs64_sz = sizeof(struct statfs64);
Alexey Samsonov46f93952013-04-03 07:24:35 +000078#endif // SANITIZER_LINUX && !SANITIZER_ANDROID
Evgeniy Stepanovb711ca62013-02-19 11:06:41 +000079
Evgeniy Stepanov06658ea2013-04-04 08:22:52 +000080 uptr sig_ign = (uptr)SIG_IGN;
81 uptr sig_dfl = (uptr)SIG_DFL;
82
Evgeniy Stepanov06658ea2013-04-04 08:22:52 +000083 uptr __sanitizer_get_sigaction_sa_sigaction(void *act) {
84 struct sigaction *a = (struct sigaction *)act;
85 // Check that sa_sigaction and sa_handler are the same.
86 CHECK((void *)&(a->sa_sigaction) == (void *)&(a->sa_handler));
87 return (uptr) a->sa_sigaction;
88 }
89 void __sanitizer_set_sigaction_sa_sigaction(void *act, uptr cb) {
90 struct sigaction *a = (struct sigaction *)act;
91 a->sa_sigaction = (void (*)(int, siginfo_t *, void *))cb;
92 }
93 bool __sanitizer_get_sigaction_sa_siginfo(void *act) {
94 struct sigaction *a = (struct sigaction *)act;
95 return a->sa_flags & SA_SIGINFO;
96 }
Evgeniy Stepanov9530eb72013-04-23 14:05:15 +000097
98 uptr __sanitizer_in_addr_sz(int af) {
99 if (af == AF_INET)
100 return sizeof(struct in_addr);
101 else if (af == AF_INET6)
102 return sizeof(struct in6_addr);
103 else
104 return 0;
105 }
Evgeniy Stepanov9358c582013-02-19 09:19:16 +0000106} // namespace __sanitizer
Evgeniy Stepanov78c56c32012-12-11 12:27:27 +0000107
Evgeniy Stepanov10fd3222013-03-13 09:01:40 +0000108COMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t));
Evgeniy Stepanov06658ea2013-04-04 08:22:52 +0000109COMPILER_CHECK(sizeof(__sanitizer::struct_sigaction_max_sz) >=
110 sizeof(__sanitizer::struct_sigaction_sz));
Evgeniy Stepanov1aad6b52013-05-17 12:51:13 +0000111#if SANITIZER_LINUX
112COMPILER_CHECK(offsetof(struct __sanitizer_dl_phdr_info, dlpi_addr) ==
113 offsetof(struct dl_phdr_info, dlpi_addr));
114COMPILER_CHECK(offsetof(struct __sanitizer_dl_phdr_info, dlpi_name) ==
115 offsetof(struct dl_phdr_info, dlpi_name));
116COMPILER_CHECK(offsetof(struct __sanitizer_dl_phdr_info, dlpi_phdr) ==
117 offsetof(struct dl_phdr_info, dlpi_phdr));
118COMPILER_CHECK(offsetof(struct __sanitizer_dl_phdr_info, dlpi_phnum) ==
119 offsetof(struct dl_phdr_info, dlpi_phnum));
120#endif
121
Evgeniy Stepanov9666d892013-05-29 11:30:00 +0000122COMPILER_CHECK(sizeof(socklen_t) == sizeof(unsigned));
123
Evgeniy Stepanov447ef192013-05-22 12:50:26 +0000124COMPILER_CHECK(sizeof(struct __sanitizer_addrinfo) == sizeof(struct addrinfo));
125COMPILER_CHECK(offsetof(struct __sanitizer_addrinfo, ai_addr) ==
126 offsetof(struct addrinfo, ai_addr));
127COMPILER_CHECK(offsetof(struct __sanitizer_addrinfo, ai_canonname) ==
128 offsetof(struct addrinfo, ai_canonname));
129COMPILER_CHECK(offsetof(struct __sanitizer_addrinfo, ai_next) ==
130 offsetof(struct addrinfo, ai_next));
131
Evgeniy Stepanov0a2cc372013-05-23 11:10:23 +0000132COMPILER_CHECK(sizeof(struct __sanitizer_hostent) == sizeof(struct hostent));
133COMPILER_CHECK(offsetof(struct __sanitizer_hostent, h_name) ==
134 offsetof(struct hostent, h_name));
135COMPILER_CHECK(offsetof(struct __sanitizer_hostent, h_aliases) ==
136 offsetof(struct hostent, h_aliases));
137COMPILER_CHECK(offsetof(struct __sanitizer_hostent, h_addr_list) ==
138 offsetof(struct hostent, h_addr_list));
139
Evgeniy Stepanov9666d892013-05-29 11:30:00 +0000140COMPILER_CHECK(sizeof(struct __sanitizer_iovec) == sizeof(struct iovec));
141COMPILER_CHECK(offsetof(struct __sanitizer_iovec, iov_base) ==
142 offsetof(struct iovec, iov_base));
143COMPILER_CHECK(offsetof(struct __sanitizer_iovec, iov_len) ==
144 offsetof(struct iovec, iov_len));
145
146COMPILER_CHECK(sizeof(struct __sanitizer_msghdr) == sizeof(struct msghdr));
147COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_name) ==
148 offsetof(struct msghdr, msg_name));
149COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_namelen) ==
150 offsetof(struct msghdr, msg_namelen));
151COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_iov) ==
152 offsetof(struct msghdr, msg_iov));
153COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_iovlen) ==
154 offsetof(struct msghdr, msg_iovlen));
155COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_control) ==
156 offsetof(struct msghdr, msg_control));
157COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_controllen) ==
158 offsetof(struct msghdr, msg_controllen));
159COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_flags) ==
160 offsetof(struct msghdr, msg_flags));
161
162COMPILER_CHECK(sizeof(struct __sanitizer_cmsghdr) == sizeof(struct cmsghdr));
163COMPILER_CHECK(offsetof(struct __sanitizer_cmsghdr, cmsg_len) ==
164 offsetof(struct cmsghdr, cmsg_len));
165COMPILER_CHECK(offsetof(struct __sanitizer_cmsghdr, cmsg_level) ==
166 offsetof(struct cmsghdr, cmsg_level));
167COMPILER_CHECK(offsetof(struct __sanitizer_cmsghdr, cmsg_type) ==
168 offsetof(struct cmsghdr, cmsg_type));
169
Alexey Samsonov46f93952013-04-03 07:24:35 +0000170#endif // SANITIZER_LINUX || SANITIZER_MAC