sanitizer_linux.h revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- sanitizer_linux.h ---------------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Linux-specific syscall wrappers and classes.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SANITIZER_LINUX_H
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SANITIZER_LINUX_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sanitizer_platform.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SANITIZER_FREEBSD || SANITIZER_LINUX
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sanitizer_common.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sanitizer_internal_defs.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sanitizer_platform_limits_posix.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct link_map;  // Opaque type returned by dlopen().
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct sigaltstack;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace __sanitizer {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dirent structure for getdents(). Note that this structure is different from
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the one in <dirent.h>, which is used by readdir().
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct linux_dirent;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Syscall wrappers.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uptr internal_sigaltstack(const struct sigaltstack* ss,
33                          struct sigaltstack* oss);
34uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
35    __sanitizer_sigset_t *oldset);
36void internal_sigfillset(__sanitizer_sigset_t *set);
37
38// Linux-only syscalls.
39#if SANITIZER_LINUX
40uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5);
41// Used only by sanitizer_stoptheworld. Signal handlers that are actually used
42// (like the process-wide error reporting SEGV handler) must use
43// internal_sigaction instead.
44int internal_sigaction_norestorer(int signum, const void *act, void *oldact);
45void internal_sigdelset(__sanitizer_sigset_t *set, int signum);
46#if defined(__x86_64__)
47uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
48                    int *parent_tidptr, void *newtls, int *child_tidptr);
49#endif
50#endif  // SANITIZER_LINUX
51
52// This class reads thread IDs from /proc/<pid>/task using only syscalls.
53class ThreadLister {
54 public:
55  explicit ThreadLister(int pid);
56  ~ThreadLister();
57  // GetNextTID returns -1 if the list of threads is exhausted, or if there has
58  // been an error.
59  int GetNextTID();
60  void Reset();
61  bool error();
62
63 private:
64  bool GetDirectoryEntries();
65
66  int pid_;
67  int descriptor_;
68  InternalScopedBuffer<char> buffer_;
69  bool error_;
70  struct linux_dirent* entry_;
71  int bytes_read_;
72};
73
74// Exposed for testing.
75uptr ThreadDescriptorSize();
76uptr ThreadSelf();
77uptr ThreadSelfOffset();
78
79// Matches a library's file name against a base name (stripping path and version
80// information).
81bool LibraryNameIs(const char *full_name, const char *base_name);
82
83// Read the name of the current binary from /proc/self/exe.
84uptr ReadBinaryName(/*out*/char *buf, uptr buf_len);
85// Cache the value of /proc/self/exe.
86void CacheBinaryName();
87
88// Call cb for each region mapped by map.
89void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));
90}  // namespace __sanitizer
91
92#endif  // SANITIZER_FREEBSD || SANITIZER_LINUX
93#endif  // SANITIZER_LINUX_H
94