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