sanitizer_platform_limits_posix.cc revision 06658ea68c4912fffafef6e65f36dce7faa4a174
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> 3206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#include <sys/ucontext.h> 339358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov#include <time.h> 349358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 3524e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX 3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/vfs.h> 3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <sys/epoll.h> 3846f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX 3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 409358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanovnamespace __sanitizer { 4178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_utsname_sz = sizeof(struct utsname); 4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_stat_sz = sizeof(struct stat); 4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_stat64_sz = sizeof(struct stat64); 449358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov unsigned struct_rusage_sz = sizeof(struct rusage); 459358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov unsigned struct_tm_sz = sizeof(struct tm); 46e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_passwd_sz = sizeof(struct passwd); 47e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_sigaction_sz = sizeof(struct sigaction); 4806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov unsigned struct_ucontext_sz = sizeof(struct ucontext); 49e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_itimerval_sz = sizeof(struct itimerval); 50e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned pthread_t_sz = sizeof(pthread_t); 519358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 5224e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX 5378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_rlimit_sz = sizeof(struct rlimit); 5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_dirent_sz = sizeof(struct dirent); 5578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_statfs_sz = sizeof(struct statfs); 5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned struct_epoll_event_sz = sizeof(struct epoll_event); 57e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov unsigned struct_timespec_sz = sizeof(struct timespec); 5846f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6024e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if SANITIZER_LINUX && !SANITIZER_ANDROID 61e4cded90e63cfe6c59d438dec63b6665f774ac16Evgeniy Stepanov unsigned struct_dirent64_sz = sizeof(struct dirent64); 62b711ca6e040d0ac4adb79e688e1a59afcc871d20Evgeniy Stepanov unsigned struct_rlimit64_sz = sizeof(struct rlimit64); 63b711ca6e040d0ac4adb79e688e1a59afcc871d20Evgeniy Stepanov unsigned struct_statfs64_sz = sizeof(struct statfs64); 6446f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX && !SANITIZER_ANDROID 65b711ca6e040d0ac4adb79e688e1a59afcc871d20Evgeniy Stepanov 6606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov uptr sig_ign = (uptr)SIG_IGN; 6706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov uptr sig_dfl = (uptr)SIG_DFL; 6806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov void* __sanitizer_get_msghdr_iov_iov_base(void* msg, int idx) { 7078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ((struct msghdr *)msg)->msg_iov[idx].iov_base; 7178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 7278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 739358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov uptr __sanitizer_get_msghdr_iov_iov_len(void* msg, int idx) { 7478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ((struct msghdr *)msg)->msg_iov[idx].iov_len; 7578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 779358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov uptr __sanitizer_get_msghdr_iovlen(void* msg) { 7878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return ((struct msghdr *)msg)->msg_iovlen; 7978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 807b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov 819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov uptr __sanitizer_get_socklen_t(void* socklen_ptr) { 827b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov return *(socklen_t*)socklen_ptr; 837b719dfce8178bdfbcd8a24893153ef82ab70be5Evgeniy Stepanov } 8406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 8506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov uptr __sanitizer_get_sigaction_sa_sigaction(void *act) { 8606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction *a = (struct sigaction *)act; 8706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov // Check that sa_sigaction and sa_handler are the same. 8806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov CHECK((void *)&(a->sa_sigaction) == (void *)&(a->sa_handler)); 8906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov return (uptr) a->sa_sigaction; 9006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 9106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov void __sanitizer_set_sigaction_sa_sigaction(void *act, uptr cb) { 9206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction *a = (struct sigaction *)act; 9306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov a->sa_sigaction = (void (*)(int, siginfo_t *, void *))cb; 9406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 9506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov bool __sanitizer_get_sigaction_sa_siginfo(void *act) { 9606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction *a = (struct sigaction *)act; 9706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov return a->sa_flags & SA_SIGINFO; 9806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov } 999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} // namespace __sanitizer 10078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 10110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovCOMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t)); 10206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovCOMPILER_CHECK(sizeof(__sanitizer::struct_sigaction_max_sz) >= 10306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov sizeof(__sanitizer::struct_sigaction_sz)); 10446f9395baf65e17f1a3f7a3a1deee72a1560ac53Alexey Samsonov#endif // SANITIZER_LINUX || SANITIZER_MAC 105