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