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 # if SANITIZER_FREEBSD
32 uptr
internal_close_range(fd_t lowfd
, fd_t highfd
, int flags
);
34 uptr
internal_close(fd_t fd
);
36 uptr
internal_read(fd_t fd
, void *buf
, uptr count
);
37 uptr
internal_write(fd_t fd
, const void *buf
, uptr count
);
40 uptr
internal_mmap(void *addr
, uptr length
, int prot
, int flags
,
42 uptr
internal_munmap(void *addr
, uptr length
);
44 uptr
internal_mremap(void *old_address
, uptr old_size
, uptr new_size
, int flags
,
47 int internal_mprotect(void *addr
, uptr length
, int prot
);
48 int internal_madvise(uptr addr
, uptr length
, int advice
);
51 uptr
internal_filesize(fd_t fd
); // -1 on error.
52 uptr
internal_stat(const char *path
, void *buf
);
53 uptr
internal_lstat(const char *path
, void *buf
);
54 uptr
internal_fstat(fd_t fd
, void *buf
);
55 uptr
internal_dup(int oldfd
);
56 uptr
internal_dup2(int oldfd
, int newfd
);
57 uptr
internal_readlink(const char *path
, char *buf
, uptr bufsize
);
58 uptr
internal_unlink(const char *path
);
59 uptr
internal_rename(const char *oldpath
, const char *newpath
);
60 uptr
internal_lseek(fd_t fd
, OFF_T offset
, int whence
);
63 uptr
internal_ptrace(int request
, int pid
, void *addr
, int data
);
65 uptr
internal_ptrace(int request
, int pid
, void *addr
, void *data
);
67 uptr
internal_waitpid(int pid
, int *status
, int options
);
70 fd_t
internal_spawn(const char *argv
[], const char *envp
[], pid_t
*pid
);
72 int internal_sysctl(const int *name
, unsigned int namelen
, void *oldp
,
73 uptr
*oldlenp
, const void *newp
, uptr newlen
);
74 int internal_sysctlbyname(const char *sname
, void *oldp
, uptr
*oldlenp
,
75 const void *newp
, uptr newlen
);
77 // These functions call appropriate pthread_ functions directly, bypassing
78 // the interceptor. They are weak and may not be present in some tools.
79 SANITIZER_WEAK_ATTRIBUTE
80 int internal_pthread_create(void *th
, void *attr
, void *(*callback
)(void *),
82 SANITIZER_WEAK_ATTRIBUTE
83 int internal_pthread_join(void *th
, void **ret
);
85 # define DEFINE_INTERNAL_PTHREAD_FUNCTIONS \
86 namespace __sanitizer { \
87 int internal_pthread_create(void *th, void *attr, \
88 void *(*callback)(void *), void *param) { \
89 return REAL(pthread_create)(th, attr, callback, param); \
91 int internal_pthread_join(void *th, void **ret) { \
92 return REAL(pthread_join)(th, ret); \
94 } // namespace __sanitizer
96 int internal_pthread_attr_getstack(void *attr
, void **addr
, uptr
*size
);
98 // A routine named real_sigaction() must be implemented by each sanitizer in
99 // order for internal_sigaction() to bypass interceptors.
100 int internal_sigaction(int signum
, const void *act
, void *oldact
);
101 void internal_sigfillset(__sanitizer_sigset_t
*set
);
102 void internal_sigemptyset(__sanitizer_sigset_t
*set
);
103 bool internal_sigismember(__sanitizer_sigset_t
*set
, int signum
);
105 uptr
internal_execve(const char *filename
, char *const argv
[],
108 bool IsStateDetached(int state
);
110 // Move the fd out of {0, 1, 2} range.
111 fd_t
ReserveStandardFds(fd_t fd
);
113 bool ShouldMockFailureToOpen(const char *path
);
114 bool OpenReadsVaArgs(int oflag
);
116 // Create a non-file mapping with a given /proc/self/maps name.
117 uptr
MmapNamed(void *addr
, uptr length
, int prot
, int flags
, const char *name
);
119 // Platforms should implement at most one of these.
120 // 1. Provide a pre-decorated file descriptor to use instead of an anonymous
122 int GetNamedMappingFd(const char *name
, uptr size
, int *flags
);
123 // 2. Add name to an existing anonymous mapping. The caller must keep *name
124 // alive at least as long as the mapping exists.
125 void DecorateMapping(uptr addr
, uptr size
, const char *name
);
127 # if !SANITIZER_FREEBSD
128 # define __sanitizer_dirsiz(dp) ((dp)->d_reclen)
131 } // namespace __sanitizer
133 #endif // SANITIZER_POSIX
135 #endif // SANITIZER_POSIX_H