sanitizer_platform_limits_posix.cc revision 4fb04a8445076debf51d220f75211584b89043c8
19358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov//===-- sanitizer_platform_limits_posix.cc --------------------------------===// 278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// The LLVM Compiler Infrastructure 478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is distributed under the University of Illinois Open Source 678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// License. See LICENSE.TXT for details. 778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov// This file is a part of Sanitizer common code. 1178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Sizes and layouts of platform-specific POSIX data structures. 1378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 1478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1524e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 1624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#include "sanitizer_platform.h" 1724e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX || SANITIZER_MAC 1878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include "sanitizer_internal_defs.h" 209358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include "sanitizer_platform_limits_posix.h" 2178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 229358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include <dirent.h> 2310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov#include <pthread.h> 24e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#include <pwd.h> 25e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#include <signal.h> 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/utsname.h> 2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/types.h> 2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/stat.h> 29e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov#include <sys/time.h> 3078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/resource.h> 319358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include <sys/socket.h> 329358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include <time.h> 339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 344fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov#if !SANITIZER_ANDROID 354fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov#include <sys/ucontext.h> 364fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov#endif // !SANITIZER_ANDROID 374fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov 3824e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX 3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/vfs.h> 4078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/epoll.h> 4146f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX 4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 439358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanovnamespace __sanitizer { 4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_utsname_sz = sizeof(struct utsname); 4578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_stat_sz = sizeof(struct stat); 4678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_stat64_sz = sizeof(struct stat64); 479358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov unsigned struct_rusage_sz = sizeof(struct rusage); 489358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov unsigned struct_tm_sz = sizeof(struct tm); 49e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_passwd_sz = sizeof(struct passwd); 50e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_sigaction_sz = sizeof(struct sigaction); 51e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_itimerval_sz = sizeof(struct itimerval); 52e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned pthread_t_sz = sizeof(pthread_t); 534fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov 544fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov#if !SANITIZER_ANDROID 55072770202bb1002172abe9a4b1eeb7f2d2fb004fEvgeniy Stepanov unsigned ucontext_t_sz = sizeof(ucontext_t); 564fb04a8445076debf51d220f75211584b89043c8Evgeniy Stepanov#endif // !SANITIZER_ANDROID 579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 5824e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_rlimit_sz = sizeof(struct rlimit); 6078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_dirent_sz = sizeof(struct dirent); 6178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_statfs_sz = sizeof(struct statfs); 6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_epoll_event_sz = sizeof(struct epoll_event); 63e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_timespec_sz = sizeof(struct timespec); 6446f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX 6578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX && !SANITIZER_ANDROID 67e4cded90e63cfe6c59d438dec63b6665f774ac16Evgeniy Stepanov unsigned struct_dirent64_sz = sizeof(struct dirent64); 68b711ca6e040d0ac4adb79e688e1a59afcc871d20Evgeniy Stepanov unsigned struct_rlimit64_sz = sizeof(struct rlimit64); 69b711ca6e040d0ac4adb79e688e1a59afcc871d20Evgeniy Stepanov unsigned struct_statfs64_sz = sizeof(struct statfs64); 7046f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX && !SANITIZER_ANDROID 71b711ca6e040d0ac4adb79e688e1a59afcc871d20Evgeniy Stepanov 7206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov uptr sig_ign = (uptr)SIG_IGN; 7306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov uptr sig_dfl = (uptr)SIG_DFL; 7406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void* __sanitizer_get_msghdr_iov_iov_base(void* msg, int idx) { 7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ((struct msghdr *)msg)->msg_iov[idx].iov_base; 7778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 7878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov uptr __sanitizer_get_msghdr_iov_iov_len(void* msg, int idx) { 8078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ((struct msghdr *)msg)->msg_iov[idx].iov_len; 8178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 8278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 839358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov uptr __sanitizer_get_msghdr_iovlen(void* msg) { 8478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ((struct msghdr *)msg)->msg_iovlen; 8578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 867b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov 879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov uptr __sanitizer_get_socklen_t(void* socklen_ptr) { 887b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov return *(socklen_t*)socklen_ptr; 897b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 9006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 9106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov uptr __sanitizer_get_sigaction_sa_sigaction(void *act) { 9206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction *a = (struct sigaction *)act; 9306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov // Check that sa_sigaction and sa_handler are the same. 9406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov CHECK((void *)&(a->sa_sigaction) == (void *)&(a->sa_handler)); 9506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov return (uptr) a->sa_sigaction; 9606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 9706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov void __sanitizer_set_sigaction_sa_sigaction(void *act, uptr cb) { 9806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction *a = (struct sigaction *)act; 9906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov a->sa_sigaction = (void (*)(int, siginfo_t *, void *))cb; 10006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 10106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov bool __sanitizer_get_sigaction_sa_siginfo(void *act) { 10206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction *a = (struct sigaction *)act; 10306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov return a->sa_flags & SA_SIGINFO; 10406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 1059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} // namespace __sanitizer 10678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 10710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovCOMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t)); 10806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovCOMPILER_CHECK(sizeof(__sanitizer::struct_sigaction_max_sz) >= 10906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov sizeof(__sanitizer::struct_sigaction_sz)); 11046f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX || SANITIZER_MAC 111