1 //===-- sanitizer_posix.h -------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file is shared between AddressSanitizer and ThreadSanitizer
10 // run-time libraries and declares some useful POSIX-specific functions.
11 //===----------------------------------------------------------------------===//
12 #ifndef SANITIZER_POSIX_H
13 #define SANITIZER_POSIX_H
15 // ----------- ATTENTION -------------
16 // This header should NOT include any other headers from sanitizer runtime.
17 #include "sanitizer_internal_defs.h"
18 #include "sanitizer_platform_limits_freebsd.h"
19 #include "sanitizer_platform_limits_netbsd.h"
20 #include "sanitizer_platform_limits_posix.h"
21 #include "sanitizer_platform_limits_solaris.h"
25 namespace __sanitizer
{
28 // Don't use directly, use __sanitizer::OpenFile() instead.
29 uptr
internal_open(const char *filename
, int flags
);
30 uptr
internal_open(const char *filename
, int flags
, u32 mode
);
31 uptr
internal_close(fd_t fd
);
33 uptr
internal_read(fd_t fd
, void *buf
, uptr count
);
34 uptr
internal_write(fd_t fd
, const void *buf
, uptr count
);
37 uptr
internal_mmap(void *addr
, uptr length
, int prot
, int flags
,
39 uptr
internal_munmap(void *addr
, uptr length
);
41 uptr
internal_mremap(void *old_address
, uptr old_size
, uptr new_size
, int flags
,
44 int internal_mprotect(void *addr
, uptr length
, int prot
);
45 int internal_madvise(uptr addr
, uptr length
, int advice
);
48 uptr
internal_filesize(fd_t fd
); // -1 on error.
49 uptr
internal_stat(const char *path
, void *buf
);
50 uptr
internal_lstat(const char *path
, void *buf
);
51 uptr
internal_fstat(fd_t fd
, void *buf
);
52 uptr
internal_dup(int oldfd
);
53 uptr
internal_dup2(int oldfd
, int newfd
);
54 uptr
internal_readlink(const char *path
, char *buf
, uptr bufsize
);
55 uptr
internal_unlink(const char *path
);
56 uptr
internal_rename(const char *oldpath
, const char *newpath
);
57 uptr
internal_lseek(fd_t fd
, OFF_T offset
, int whence
);
60 uptr
internal_ptrace(int request
, int pid
, void *addr
, int data
);
62 uptr
internal_ptrace(int request
, int pid
, void *addr
, void *data
);
64 uptr
internal_waitpid(int pid
, int *status
, int options
);
67 fd_t
internal_spawn(const char *argv
[], const char *envp
[], pid_t
*pid
);
69 int internal_sysctl(const int *name
, unsigned int namelen
, void *oldp
,
70 uptr
*oldlenp
, const void *newp
, uptr newlen
);
71 int internal_sysctlbyname(const char *sname
, void *oldp
, uptr
*oldlenp
,
72 const void *newp
, uptr newlen
);
74 // These functions call appropriate pthread_ functions directly, bypassing
75 // the interceptor. They are weak and may not be present in some tools.
76 SANITIZER_WEAK_ATTRIBUTE
77 int real_pthread_create(void *th
, void *attr
, void *(*callback
)(void *),
79 SANITIZER_WEAK_ATTRIBUTE
80 int real_pthread_join(void *th
, void **ret
);
82 #define DEFINE_REAL_PTHREAD_FUNCTIONS \
83 namespace __sanitizer { \
84 int real_pthread_create(void *th, void *attr, void *(*callback)(void *), \
86 return REAL(pthread_create)(th, attr, callback, param); \
88 int real_pthread_join(void *th, void **ret) { \
89 return REAL(pthread_join(th, ret)); \
91 } // namespace __sanitizer
93 int my_pthread_attr_getstack(void *attr
, void **addr
, uptr
*size
);
95 // A routine named real_sigaction() must be implemented by each sanitizer in
96 // order for internal_sigaction() to bypass interceptors.
97 int internal_sigaction(int signum
, const void *act
, void *oldact
);
98 void internal_sigfillset(__sanitizer_sigset_t
*set
);
99 void internal_sigemptyset(__sanitizer_sigset_t
*set
);
100 bool internal_sigismember(__sanitizer_sigset_t
*set
, int signum
);
102 uptr
internal_execve(const char *filename
, char *const argv
[],
105 bool IsStateDetached(int state
);
107 // Move the fd out of {0, 1, 2} range.
108 fd_t
ReserveStandardFds(fd_t fd
);
110 bool ShouldMockFailureToOpen(const char *path
);
112 // Create a non-file mapping with a given /proc/self/maps name.
113 uptr
MmapNamed(void *addr
, uptr length
, int prot
, int flags
, const char *name
);
115 // Platforms should implement at most one of these.
116 // 1. Provide a pre-decorated file descriptor to use instead of an anonymous
118 int GetNamedMappingFd(const char *name
, uptr size
, int *flags
);
119 // 2. Add name to an existing anonymous mapping. The caller must keep *name
120 // alive at least as long as the mapping exists.
121 void DecorateMapping(uptr addr
, uptr size
, const char *name
);
124 } // namespace __sanitizer
126 #endif // SANITIZER_POSIX
128 #endif // SANITIZER_POSIX_H