1//===-- sanitizer_linux.h ---------------------------------------*- C++ -*-===//
2//
3// This file is distributed under the University of Illinois Open Source
4// License. See LICENSE.TXT for details.
5//
6//===----------------------------------------------------------------------===//
7//
8// Linux-specific syscall wrappers and classes.
9//
10//===----------------------------------------------------------------------===//
11#ifndef SANITIZER_LINUX_H
12#define SANITIZER_LINUX_H
13
14#include "sanitizer_platform.h"
15#if SANITIZER_FREEBSD || SANITIZER_LINUX
16#include "sanitizer_common.h"
17#include "sanitizer_internal_defs.h"
18#include "sanitizer_platform_limits_posix.h"
19
20struct link_map;  // Opaque type returned by dlopen().
21struct sigaltstack;
22
23namespace __sanitizer {
24// Dirent structure for getdents(). Note that this structure is different from
25// the one in <dirent.h>, which is used by readdir().
26struct linux_dirent;
27
28// Syscall wrappers.
29uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
30uptr internal_sigaltstack(const struct sigaltstack* ss,
31                          struct sigaltstack* oss);
32uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
33    __sanitizer_sigset_t *oldset);
34void internal_sigfillset(__sanitizer_sigset_t *set);
35
36// Linux-only syscalls.
37#if SANITIZER_LINUX
38uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5);
39// Used only by sanitizer_stoptheworld. Signal handlers that are actually used
40// (like the process-wide error reporting SEGV handler) must use
41// internal_sigaction instead.
42int internal_sigaction_norestorer(int signum, const void *act, void *oldact);
43void internal_sigdelset(__sanitizer_sigset_t *set, int signum);
44#if defined(__x86_64__)
45uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
46                    int *parent_tidptr, void *newtls, int *child_tidptr);
47#endif
48#endif  // SANITIZER_LINUX
49
50// This class reads thread IDs from /proc/<pid>/task using only syscalls.
51class ThreadLister {
52 public:
53  explicit ThreadLister(int pid);
54  ~ThreadLister();
55  // GetNextTID returns -1 if the list of threads is exhausted, or if there has
56  // been an error.
57  int GetNextTID();
58  void Reset();
59  bool error();
60
61 private:
62  bool GetDirectoryEntries();
63
64  int pid_;
65  int descriptor_;
66  InternalScopedBuffer<char> buffer_;
67  bool error_;
68  struct linux_dirent* entry_;
69  int bytes_read_;
70};
71
72// Exposed for testing.
73uptr ThreadDescriptorSize();
74uptr ThreadSelf();
75uptr ThreadSelfOffset();
76
77// Matches a library's file name against a base name (stripping path and version
78// information).
79bool LibraryNameIs(const char *full_name, const char *base_name);
80
81// Read the name of the current binary from /proc/self/exe.
82uptr ReadBinaryName(/*out*/char *buf, uptr buf_len);
83// Cache the value of /proc/self/exe.
84void CacheBinaryName();
85
86// Call cb for each region mapped by map.
87void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));
88}  // namespace __sanitizer
89
90#endif  // SANITIZER_FREEBSD || SANITIZER_LINUX
91#endif  // SANITIZER_LINUX_H
92