xref: /llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp (revision b707d52fc557d24c4269987a80dc270e7adad942)
1 //===-- sanitizer_linux.cpp -----------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file is shared between AddressSanitizer and ThreadSanitizer
10 // run-time libraries and implements linux-specific functions from
11 // sanitizer_libc.h.
12 //===----------------------------------------------------------------------===//
13 
14 #include "sanitizer_platform.h"
15 
16 #if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
17     SANITIZER_SOLARIS
18 
19 #  include "sanitizer_common.h"
20 #  include "sanitizer_flags.h"
21 #  include "sanitizer_getauxval.h"
22 #  include "sanitizer_internal_defs.h"
23 #  include "sanitizer_libc.h"
24 #  include "sanitizer_linux.h"
25 #  include "sanitizer_mutex.h"
26 #  include "sanitizer_placement_new.h"
27 #  include "sanitizer_procmaps.h"
28 
29 #  if SANITIZER_LINUX && !SANITIZER_GO
30 #    include <asm/param.h>
31 #  endif
32 
33 // For mips64, syscall(__NR_stat) fills the buffer in the 'struct kernel_stat'
34 // format. Struct kernel_stat is defined as 'struct stat' in asm/stat.h. To
35 // access stat from asm/stat.h, without conflicting with definition in
36 // sys/stat.h, we use this trick.  sparc64 is similar, using
37 // syscall(__NR_stat64) and struct kernel_stat64.
38 #  if SANITIZER_LINUX && (SANITIZER_MIPS64 || SANITIZER_SPARC64)
39 #    include <asm/unistd.h>
40 #    include <sys/types.h>
41 #    define stat kernel_stat
42 #    if SANITIZER_SPARC64
43 #      define stat64 kernel_stat64
44 #    endif
45 #    if SANITIZER_GO
46 #      undef st_atime
47 #      undef st_mtime
48 #      undef st_ctime
49 #      define st_atime st_atim
50 #      define st_mtime st_mtim
51 #      define st_ctime st_ctim
52 #    endif
53 #    include <asm/stat.h>
54 #    undef stat
55 #    undef stat64
56 #  endif
57 
58 #  include <dlfcn.h>
59 #  include <errno.h>
60 #  include <fcntl.h>
61 #  include <link.h>
62 #  include <pthread.h>
63 #  include <sched.h>
64 #  include <signal.h>
65 #  include <sys/mman.h>
66 #  if !SANITIZER_SOLARIS
67 #    include <sys/ptrace.h>
68 #  endif
69 #  include <sys/resource.h>
70 #  include <sys/stat.h>
71 #  include <sys/syscall.h>
72 #  include <sys/time.h>
73 #  include <sys/types.h>
74 #  include <ucontext.h>
75 #  include <unistd.h>
76 
77 #  if SANITIZER_LINUX
78 #    include <sys/utsname.h>
79 #  endif
80 
81 #  if SANITIZER_LINUX && !SANITIZER_ANDROID
82 #    include <sys/personality.h>
83 #  endif
84 
85 #  if SANITIZER_LINUX && defined(__loongarch__)
86 #    include <sys/sysmacros.h>
87 #  endif
88 
89 #  if SANITIZER_FREEBSD
90 #    include <machine/atomic.h>
91 #    include <sys/exec.h>
92 #    include <sys/procctl.h>
93 #    include <sys/sysctl.h>
94 extern "C" {
95 // <sys/umtx.h> must be included after <errno.h> and <sys/types.h> on
96 // FreeBSD 9.2 and 10.0.
97 #    include <sys/umtx.h>
98 }
99 #    include <sys/thr.h>
100 #  endif  // SANITIZER_FREEBSD
101 
102 #  if SANITIZER_NETBSD
103 #    include <limits.h>  // For NAME_MAX
104 #    include <sys/exec.h>
105 #    include <sys/sysctl.h>
106 extern struct ps_strings *__ps_strings;
107 #  endif  // SANITIZER_NETBSD
108 
109 #  if SANITIZER_SOLARIS
110 #    include <stddef.h>
111 #    include <stdlib.h>
112 #    include <sys/frame.h>
113 #    include <thread.h>
114 #    define environ _environ
115 #  endif
116 
117 extern char **environ;
118 
119 #  if SANITIZER_LINUX
120 // <linux/time.h>
121 struct kernel_timeval {
122   long tv_sec;
123   long tv_usec;
124 };
125 
126 // <linux/futex.h> is broken on some linux distributions.
127 const int FUTEX_WAIT = 0;
128 const int FUTEX_WAKE = 1;
129 const int FUTEX_PRIVATE_FLAG = 128;
130 const int FUTEX_WAIT_PRIVATE = FUTEX_WAIT | FUTEX_PRIVATE_FLAG;
131 const int FUTEX_WAKE_PRIVATE = FUTEX_WAKE | FUTEX_PRIVATE_FLAG;
132 #  endif  // SANITIZER_LINUX
133 
134 // Are we using 32-bit or 64-bit Linux syscalls?
135 // x32 (which defines __x86_64__) has SANITIZER_WORDSIZE == 32
136 // but it still needs to use 64-bit syscalls.
137 #  if SANITIZER_LINUX &&                                \
138       (defined(__x86_64__) || defined(__powerpc64__) || \
139        SANITIZER_WORDSIZE == 64 ||                      \
140        (defined(__mips__) && defined(_ABIN32) && _MIPS_SIM == _ABIN32))
141 #    define SANITIZER_LINUX_USES_64BIT_SYSCALLS 1
142 #  else
143 #    define SANITIZER_LINUX_USES_64BIT_SYSCALLS 0
144 #  endif
145 
146 // Note : FreeBSD implemented both Linux and OpenBSD apis.
147 #  if SANITIZER_LINUX && defined(__NR_getrandom)
148 #    if !defined(GRND_NONBLOCK)
149 #      define GRND_NONBLOCK 1
150 #    endif
151 #    define SANITIZER_USE_GETRANDOM 1
152 #  else
153 #    define SANITIZER_USE_GETRANDOM 0
154 #  endif  // SANITIZER_LINUX && defined(__NR_getrandom)
155 
156 #  if SANITIZER_FREEBSD
157 #    define SANITIZER_USE_GETENTROPY 1
158 extern "C" void *__sys_mmap(void *addr, size_t len, int prot, int flags, int fd,
159                             off_t offset);
160 #  endif
161 
162 namespace __sanitizer {
163 
164 void SetSigProcMask(__sanitizer_sigset_t *set, __sanitizer_sigset_t *oldset) {
165   CHECK_EQ(0, internal_sigprocmask(SIG_SETMASK, set, oldset));
166 }
167 
168 #  if SANITIZER_LINUX
169 // Deletes the specified signal from newset, if it is not present in oldset
170 // Equivalently: newset[signum] = newset[signum] & oldset[signum]
171 static void KeepUnblocked(__sanitizer_sigset_t &newset,
172                           __sanitizer_sigset_t &oldset, int signum) {
173   // FIXME: https://github.com/google/sanitizers/issues/1816
174   if (SANITIZER_ANDROID || !internal_sigismember(&oldset, signum))
175     internal_sigdelset(&newset, signum);
176 }
177 #  endif
178 
179 // Block asynchronous signals
180 void BlockSignals(__sanitizer_sigset_t *oldset) {
181   __sanitizer_sigset_t newset;
182   internal_sigfillset(&newset);
183 
184 #  if SANITIZER_LINUX
185   __sanitizer_sigset_t currentset;
186 
187 #    if !SANITIZER_ANDROID
188   // FIXME: https://github.com/google/sanitizers/issues/1816
189   SetSigProcMask(NULL, &currentset);
190 
191   // Glibc uses SIGSETXID signal during setuid call. If this signal is blocked
192   // on any thread, setuid call hangs.
193   // See test/sanitizer_common/TestCases/Linux/setuid.c.
194   KeepUnblocked(newset, currentset, 33);
195 #    endif  // !SANITIZER_ANDROID
196 
197   // Seccomp-BPF-sandboxed processes rely on SIGSYS to handle trapped syscalls.
198   // If this signal is blocked, such calls cannot be handled and the process may
199   // hang.
200   KeepUnblocked(newset, currentset, 31);
201 
202 #    if !SANITIZER_ANDROID
203   // Don't block synchronous signals
204   // but also don't unblock signals that the user had deliberately blocked.
205   // FIXME: https://github.com/google/sanitizers/issues/1816
206   KeepUnblocked(newset, currentset, SIGSEGV);
207   KeepUnblocked(newset, currentset, SIGBUS);
208   KeepUnblocked(newset, currentset, SIGILL);
209   KeepUnblocked(newset, currentset, SIGTRAP);
210   KeepUnblocked(newset, currentset, SIGABRT);
211   KeepUnblocked(newset, currentset, SIGFPE);
212   KeepUnblocked(newset, currentset, SIGPIPE);
213 #    endif  //! SANITIZER_ANDROID
214 
215 #  endif  // SANITIZER_LINUX
216 
217   SetSigProcMask(&newset, oldset);
218 }
219 
220 ScopedBlockSignals::ScopedBlockSignals(__sanitizer_sigset_t *copy) {
221   BlockSignals(&saved_);
222   if (copy)
223     internal_memcpy(copy, &saved_, sizeof(saved_));
224 }
225 
226 ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
227 
228 #  if SANITIZER_LINUX && defined(__x86_64__)
229 #    include "sanitizer_syscall_linux_x86_64.inc"
230 #  elif SANITIZER_LINUX && SANITIZER_RISCV64
231 #    include "sanitizer_syscall_linux_riscv64.inc"
232 #  elif SANITIZER_LINUX && defined(__aarch64__)
233 #    include "sanitizer_syscall_linux_aarch64.inc"
234 #  elif SANITIZER_LINUX && defined(__arm__)
235 #    include "sanitizer_syscall_linux_arm.inc"
236 #  elif SANITIZER_LINUX && defined(__hexagon__)
237 #    include "sanitizer_syscall_linux_hexagon.inc"
238 #  elif SANITIZER_LINUX && SANITIZER_LOONGARCH64
239 #    include "sanitizer_syscall_linux_loongarch64.inc"
240 #  else
241 #    include "sanitizer_syscall_generic.inc"
242 #  endif
243 
244 // --------------- sanitizer_libc.h
245 #  if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
246 #    if !SANITIZER_S390
247 uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
248                    u64 offset) {
249 #      if SANITIZER_FREEBSD
250   return (uptr)__sys_mmap(addr, length, prot, flags, fd, offset);
251 #      elif SANITIZER_LINUX_USES_64BIT_SYSCALLS
252   return internal_syscall(SYSCALL(mmap), (uptr)addr, length, prot, flags, fd,
253                           offset);
254 #      else
255   // mmap2 specifies file offset in 4096-byte units.
256   CHECK(IsAligned(offset, 4096));
257   return internal_syscall(SYSCALL(mmap2), addr, length, prot, flags, fd,
258                           (OFF_T)(offset / 4096));
259 #      endif
260 }
261 #    endif  // !SANITIZER_S390
262 
263 uptr internal_munmap(void *addr, uptr length) {
264   return internal_syscall(SYSCALL(munmap), (uptr)addr, length);
265 }
266 
267 #    if SANITIZER_LINUX
268 uptr internal_mremap(void *old_address, uptr old_size, uptr new_size, int flags,
269                      void *new_address) {
270   return internal_syscall(SYSCALL(mremap), (uptr)old_address, old_size,
271                           new_size, flags, (uptr)new_address);
272 }
273 #    endif
274 
275 int internal_mprotect(void *addr, uptr length, int prot) {
276   return internal_syscall(SYSCALL(mprotect), (uptr)addr, length, prot);
277 }
278 
279 int internal_madvise(uptr addr, uptr length, int advice) {
280   return internal_syscall(SYSCALL(madvise), addr, length, advice);
281 }
282 
283 #    if SANITIZER_FREEBSD
284 uptr internal_close_range(fd_t lowfd, fd_t highfd, int flags) {
285   return internal_syscall(SYSCALL(close_range), lowfd, highfd, flags);
286 }
287 #    endif
288 uptr internal_close(fd_t fd) { return internal_syscall(SYSCALL(close), fd); }
289 
290 uptr internal_open(const char *filename, int flags) {
291 #    if SANITIZER_LINUX
292   return internal_syscall(SYSCALL(openat), AT_FDCWD, (uptr)filename, flags);
293 #    else
294   return internal_syscall(SYSCALL(open), (uptr)filename, flags);
295 #    endif
296 }
297 
298 uptr internal_open(const char *filename, int flags, u32 mode) {
299 #    if SANITIZER_LINUX
300   return internal_syscall(SYSCALL(openat), AT_FDCWD, (uptr)filename, flags,
301                           mode);
302 #    else
303   return internal_syscall(SYSCALL(open), (uptr)filename, flags, mode);
304 #    endif
305 }
306 
307 uptr internal_read(fd_t fd, void *buf, uptr count) {
308   sptr res;
309   HANDLE_EINTR(res,
310                (sptr)internal_syscall(SYSCALL(read), fd, (uptr)buf, count));
311   return res;
312 }
313 
314 uptr internal_write(fd_t fd, const void *buf, uptr count) {
315   sptr res;
316   HANDLE_EINTR(res,
317                (sptr)internal_syscall(SYSCALL(write), fd, (uptr)buf, count));
318   return res;
319 }
320 
321 uptr internal_ftruncate(fd_t fd, uptr size) {
322   sptr res;
323   HANDLE_EINTR(res,
324                (sptr)internal_syscall(SYSCALL(ftruncate), fd, (OFF_T)size));
325   return res;
326 }
327 
328 #    if !SANITIZER_LINUX_USES_64BIT_SYSCALLS && SANITIZER_LINUX
329 static void stat64_to_stat(struct stat64 *in, struct stat *out) {
330   internal_memset(out, 0, sizeof(*out));
331   out->st_dev = in->st_dev;
332   out->st_ino = in->st_ino;
333   out->st_mode = in->st_mode;
334   out->st_nlink = in->st_nlink;
335   out->st_uid = in->st_uid;
336   out->st_gid = in->st_gid;
337   out->st_rdev = in->st_rdev;
338   out->st_size = in->st_size;
339   out->st_blksize = in->st_blksize;
340   out->st_blocks = in->st_blocks;
341   out->st_atime = in->st_atime;
342   out->st_mtime = in->st_mtime;
343   out->st_ctime = in->st_ctime;
344 }
345 #    endif
346 
347 #    if SANITIZER_LINUX && defined(__loongarch__)
348 static void statx_to_stat(struct statx *in, struct stat *out) {
349   internal_memset(out, 0, sizeof(*out));
350   out->st_dev = makedev(in->stx_dev_major, in->stx_dev_minor);
351   out->st_ino = in->stx_ino;
352   out->st_mode = in->stx_mode;
353   out->st_nlink = in->stx_nlink;
354   out->st_uid = in->stx_uid;
355   out->st_gid = in->stx_gid;
356   out->st_rdev = makedev(in->stx_rdev_major, in->stx_rdev_minor);
357   out->st_size = in->stx_size;
358   out->st_blksize = in->stx_blksize;
359   out->st_blocks = in->stx_blocks;
360   out->st_atime = in->stx_atime.tv_sec;
361   out->st_atim.tv_nsec = in->stx_atime.tv_nsec;
362   out->st_mtime = in->stx_mtime.tv_sec;
363   out->st_mtim.tv_nsec = in->stx_mtime.tv_nsec;
364   out->st_ctime = in->stx_ctime.tv_sec;
365   out->st_ctim.tv_nsec = in->stx_ctime.tv_nsec;
366 }
367 #    endif
368 
369 #    if SANITIZER_MIPS64 || SANITIZER_SPARC64
370 #      if SANITIZER_MIPS64
371 typedef struct kernel_stat kstat_t;
372 #      else
373 typedef struct kernel_stat64 kstat_t;
374 #      endif
375 // Undefine compatibility macros from <sys/stat.h>
376 // so that they would not clash with the kernel_stat
377 // st_[a|m|c]time fields
378 #      if !SANITIZER_GO
379 #        undef st_atime
380 #        undef st_mtime
381 #        undef st_ctime
382 #      endif
383 #      if defined(SANITIZER_ANDROID)
384 // Bionic sys/stat.h defines additional macros
385 // for compatibility with the old NDKs and
386 // they clash with the kernel_stat structure
387 // st_[a|m|c]time_nsec fields.
388 #        undef st_atime_nsec
389 #        undef st_mtime_nsec
390 #        undef st_ctime_nsec
391 #      endif
392 static void kernel_stat_to_stat(kstat_t *in, struct stat *out) {
393   internal_memset(out, 0, sizeof(*out));
394   out->st_dev = in->st_dev;
395   out->st_ino = in->st_ino;
396   out->st_mode = in->st_mode;
397   out->st_nlink = in->st_nlink;
398   out->st_uid = in->st_uid;
399   out->st_gid = in->st_gid;
400   out->st_rdev = in->st_rdev;
401   out->st_size = in->st_size;
402   out->st_blksize = in->st_blksize;
403   out->st_blocks = in->st_blocks;
404 #      if defined(__USE_MISC) || defined(__USE_XOPEN2K8) || \
405           defined(SANITIZER_ANDROID)
406   out->st_atim.tv_sec = in->st_atime;
407   out->st_atim.tv_nsec = in->st_atime_nsec;
408   out->st_mtim.tv_sec = in->st_mtime;
409   out->st_mtim.tv_nsec = in->st_mtime_nsec;
410   out->st_ctim.tv_sec = in->st_ctime;
411   out->st_ctim.tv_nsec = in->st_ctime_nsec;
412 #      else
413   out->st_atime = in->st_atime;
414   out->st_atimensec = in->st_atime_nsec;
415   out->st_mtime = in->st_mtime;
416   out->st_mtimensec = in->st_mtime_nsec;
417   out->st_ctime = in->st_ctime;
418   out->st_atimensec = in->st_ctime_nsec;
419 #      endif
420 }
421 #    endif
422 
423 uptr internal_stat(const char *path, void *buf) {
424 #    if SANITIZER_FREEBSD
425   return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, (uptr)buf, 0);
426 #    elif SANITIZER_LINUX
427 #      if defined(__loongarch__)
428   struct statx bufx;
429   int res = internal_syscall(SYSCALL(statx), AT_FDCWD, (uptr)path,
430                              AT_NO_AUTOMOUNT, STATX_BASIC_STATS, (uptr)&bufx);
431   statx_to_stat(&bufx, (struct stat *)buf);
432   return res;
433 #      elif (                                                                 \
434           SANITIZER_WORDSIZE == 64 || SANITIZER_X32 ||                        \
435           (defined(__mips__) && defined(_ABIN32) && _MIPS_SIM == _ABIN32)) && \
436           !SANITIZER_SPARC
437   return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf,
438                           0);
439 #      elif SANITIZER_SPARC64
440   kstat_t buf64;
441   int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path,
442                              (uptr)&buf64, 0);
443   kernel_stat_to_stat(&buf64, (struct stat *)buf);
444   return res;
445 #      else
446   struct stat64 buf64;
447   int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path,
448                              (uptr)&buf64, 0);
449   stat64_to_stat(&buf64, (struct stat *)buf);
450   return res;
451 #      endif
452 #    else
453   struct stat64 buf64;
454   int res = internal_syscall(SYSCALL(stat64), path, &buf64);
455   stat64_to_stat(&buf64, (struct stat *)buf);
456   return res;
457 #    endif
458 }
459 
460 uptr internal_lstat(const char *path, void *buf) {
461 #    if SANITIZER_FREEBSD
462   return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, (uptr)buf,
463                           AT_SYMLINK_NOFOLLOW);
464 #    elif SANITIZER_LINUX
465 #      if defined(__loongarch__)
466   struct statx bufx;
467   int res = internal_syscall(SYSCALL(statx), AT_FDCWD, (uptr)path,
468                              AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT,
469                              STATX_BASIC_STATS, (uptr)&bufx);
470   statx_to_stat(&bufx, (struct stat *)buf);
471   return res;
472 #      elif (                                                                 \
473           defined(_LP64) || SANITIZER_X32 ||                                  \
474           (defined(__mips__) && defined(_ABIN32) && _MIPS_SIM == _ABIN32)) && \
475           !SANITIZER_SPARC
476   return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf,
477                           AT_SYMLINK_NOFOLLOW);
478 #      elif SANITIZER_SPARC64
479   kstat_t buf64;
480   int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path,
481                              (uptr)&buf64, AT_SYMLINK_NOFOLLOW);
482   kernel_stat_to_stat(&buf64, (struct stat *)buf);
483   return res;
484 #      else
485   struct stat64 buf64;
486   int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path,
487                              (uptr)&buf64, AT_SYMLINK_NOFOLLOW);
488   stat64_to_stat(&buf64, (struct stat *)buf);
489   return res;
490 #      endif
491 #    else
492   struct stat64 buf64;
493   int res = internal_syscall(SYSCALL(lstat64), path, &buf64);
494   stat64_to_stat(&buf64, (struct stat *)buf);
495   return res;
496 #    endif
497 }
498 
499 uptr internal_fstat(fd_t fd, void *buf) {
500 #    if SANITIZER_FREEBSD || SANITIZER_LINUX_USES_64BIT_SYSCALLS
501 #      if SANITIZER_MIPS64
502   // For mips64, fstat syscall fills buffer in the format of kernel_stat
503   kstat_t kbuf;
504   int res = internal_syscall(SYSCALL(fstat), fd, &kbuf);
505   kernel_stat_to_stat(&kbuf, (struct stat *)buf);
506   return res;
507 #      elif SANITIZER_LINUX && SANITIZER_SPARC64
508   // For sparc64, fstat64 syscall fills buffer in the format of kernel_stat64
509   kstat_t kbuf;
510   int res = internal_syscall(SYSCALL(fstat64), fd, &kbuf);
511   kernel_stat_to_stat(&kbuf, (struct stat *)buf);
512   return res;
513 #      elif SANITIZER_LINUX && defined(__loongarch__)
514   struct statx bufx;
515   int res = internal_syscall(SYSCALL(statx), fd, "", AT_EMPTY_PATH,
516                              STATX_BASIC_STATS, (uptr)&bufx);
517   statx_to_stat(&bufx, (struct stat *)buf);
518   return res;
519 #      else
520   return internal_syscall(SYSCALL(fstat), fd, (uptr)buf);
521 #      endif
522 #    else
523   struct stat64 buf64;
524   int res = internal_syscall(SYSCALL(fstat64), fd, &buf64);
525   stat64_to_stat(&buf64, (struct stat *)buf);
526   return res;
527 #    endif
528 }
529 
530 uptr internal_filesize(fd_t fd) {
531   struct stat st;
532   if (internal_fstat(fd, &st))
533     return -1;
534   return (uptr)st.st_size;
535 }
536 
537 uptr internal_dup(int oldfd) { return internal_syscall(SYSCALL(dup), oldfd); }
538 
539 uptr internal_dup2(int oldfd, int newfd) {
540 #    if SANITIZER_LINUX
541   return internal_syscall(SYSCALL(dup3), oldfd, newfd, 0);
542 #    else
543   return internal_syscall(SYSCALL(dup2), oldfd, newfd);
544 #    endif
545 }
546 
547 uptr internal_readlink(const char *path, char *buf, uptr bufsize) {
548 #    if SANITIZER_LINUX
549   return internal_syscall(SYSCALL(readlinkat), AT_FDCWD, (uptr)path, (uptr)buf,
550                           bufsize);
551 #    else
552   return internal_syscall(SYSCALL(readlink), (uptr)path, (uptr)buf, bufsize);
553 #    endif
554 }
555 
556 uptr internal_unlink(const char *path) {
557 #    if SANITIZER_LINUX
558   return internal_syscall(SYSCALL(unlinkat), AT_FDCWD, (uptr)path, 0);
559 #    else
560   return internal_syscall(SYSCALL(unlink), (uptr)path);
561 #    endif
562 }
563 
564 uptr internal_rename(const char *oldpath, const char *newpath) {
565 #    if (defined(__riscv) || defined(__loongarch__)) && defined(__linux__)
566   return internal_syscall(SYSCALL(renameat2), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
567                           (uptr)newpath, 0);
568 #    elif SANITIZER_LINUX
569   return internal_syscall(SYSCALL(renameat), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
570                           (uptr)newpath);
571 #    else
572   return internal_syscall(SYSCALL(rename), (uptr)oldpath, (uptr)newpath);
573 #    endif
574 }
575 
576 uptr internal_sched_yield() { return internal_syscall(SYSCALL(sched_yield)); }
577 
578 void internal_usleep(u64 useconds) {
579   struct timespec ts;
580   ts.tv_sec = useconds / 1000000;
581   ts.tv_nsec = (useconds % 1000000) * 1000;
582   internal_syscall(SYSCALL(nanosleep), &ts, &ts);
583 }
584 
585 uptr internal_execve(const char *filename, char *const argv[],
586                      char *const envp[]) {
587   return internal_syscall(SYSCALL(execve), (uptr)filename, (uptr)argv,
588                           (uptr)envp);
589 }
590 #  endif  // !SANITIZER_SOLARIS && !SANITIZER_NETBSD
591 
592 #  if !SANITIZER_NETBSD
593 void internal__exit(int exitcode) {
594 #    if SANITIZER_FREEBSD || SANITIZER_SOLARIS
595   internal_syscall(SYSCALL(exit), exitcode);
596 #    else
597   internal_syscall(SYSCALL(exit_group), exitcode);
598 #    endif
599   Die();  // Unreachable.
600 }
601 #  endif  // !SANITIZER_NETBSD
602 
603 // ----------------- sanitizer_common.h
604 bool FileExists(const char *filename) {
605   if (ShouldMockFailureToOpen(filename))
606     return false;
607   struct stat st;
608   if (internal_stat(filename, &st))
609     return false;
610   // Sanity check: filename is a regular file.
611   return S_ISREG(st.st_mode);
612 }
613 
614 bool DirExists(const char *path) {
615   struct stat st;
616   if (internal_stat(path, &st))
617     return false;
618   return S_ISDIR(st.st_mode);
619 }
620 
621 #  if !SANITIZER_NETBSD
622 tid_t GetTid() {
623 #    if SANITIZER_FREEBSD
624   long Tid;
625   thr_self(&Tid);
626   return Tid;
627 #    elif SANITIZER_SOLARIS
628   return thr_self();
629 #    else
630   return internal_syscall(SYSCALL(gettid));
631 #    endif
632 }
633 
634 int TgKill(pid_t pid, tid_t tid, int sig) {
635 #    if SANITIZER_LINUX
636   return internal_syscall(SYSCALL(tgkill), pid, tid, sig);
637 #    elif SANITIZER_FREEBSD
638   return internal_syscall(SYSCALL(thr_kill2), pid, tid, sig);
639 #    elif SANITIZER_SOLARIS
640   (void)pid;
641   errno = thr_kill(tid, sig);
642   // TgKill is expected to return -1 on error, not an errno.
643   return errno != 0 ? -1 : 0;
644 #    endif
645 }
646 #  endif
647 
648 #  if SANITIZER_GLIBC
649 u64 NanoTime() {
650   kernel_timeval tv;
651   internal_memset(&tv, 0, sizeof(tv));
652   internal_syscall(SYSCALL(gettimeofday), &tv, 0);
653   return (u64)tv.tv_sec * 1000 * 1000 * 1000 + tv.tv_usec * 1000;
654 }
655 // Used by real_clock_gettime.
656 uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
657   return internal_syscall(SYSCALL(clock_gettime), clk_id, tp);
658 }
659 #  elif !SANITIZER_SOLARIS && !SANITIZER_NETBSD
660 u64 NanoTime() {
661   struct timespec ts;
662   clock_gettime(CLOCK_REALTIME, &ts);
663   return (u64)ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
664 }
665 #  endif
666 
667 // Like getenv, but reads env directly from /proc (on Linux) or parses the
668 // 'environ' array (on some others) and does not use libc. This function
669 // should be called first inside __asan_init.
670 const char *GetEnv(const char *name) {
671 #  if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_SOLARIS
672   if (::environ != 0) {
673     uptr NameLen = internal_strlen(name);
674     for (char **Env = ::environ; *Env != 0; Env++) {
675       if (internal_strncmp(*Env, name, NameLen) == 0 && (*Env)[NameLen] == '=')
676         return (*Env) + NameLen + 1;
677     }
678   }
679   return 0;  // Not found.
680 #  elif SANITIZER_LINUX
681   static char *environ;
682   static uptr len;
683   static bool inited;
684   if (!inited) {
685     inited = true;
686     uptr environ_size;
687     if (!ReadFileToBuffer("/proc/self/environ", &environ, &environ_size, &len))
688       environ = nullptr;
689   }
690   if (!environ || len == 0)
691     return nullptr;
692   uptr namelen = internal_strlen(name);
693   const char *p = environ;
694   while (*p != '\0') {  // will happen at the \0\0 that terminates the buffer
695     // proc file has the format NAME=value\0NAME=value\0NAME=value\0...
696     const char *endp = (char *)internal_memchr(p, '\0', len - (p - environ));
697     if (!endp)  // this entry isn't NUL terminated
698       return nullptr;
699     else if (!internal_memcmp(p, name, namelen) && p[namelen] == '=')  // Match.
700       return p + namelen + 1;  // point after =
701     p = endp + 1;
702   }
703   return nullptr;  // Not found.
704 #  else
705 #    error "Unsupported platform"
706 #  endif
707 }
708 
709 #  if !SANITIZER_FREEBSD && !SANITIZER_NETBSD && !SANITIZER_GO
710 extern "C" {
711 SANITIZER_WEAK_ATTRIBUTE extern void *__libc_stack_end;
712 }
713 #  endif
714 
715 #  if !SANITIZER_FREEBSD && !SANITIZER_NETBSD
716 static void ReadNullSepFileToArray(const char *path, char ***arr,
717                                    int arr_size) {
718   char *buff;
719   uptr buff_size;
720   uptr buff_len;
721   *arr = (char **)MmapOrDie(arr_size * sizeof(char *), "NullSepFileArray");
722   if (!ReadFileToBuffer(path, &buff, &buff_size, &buff_len, 1024 * 1024)) {
723     (*arr)[0] = nullptr;
724     return;
725   }
726   (*arr)[0] = buff;
727   int count, i;
728   for (count = 1, i = 1;; i++) {
729     if (buff[i] == 0) {
730       if (buff[i + 1] == 0)
731         break;
732       (*arr)[count] = &buff[i + 1];
733       CHECK_LE(count, arr_size - 1);  // FIXME: make this more flexible.
734       count++;
735     }
736   }
737   (*arr)[count] = nullptr;
738 }
739 #  endif
740 
741 static void GetArgsAndEnv(char ***argv, char ***envp) {
742 #  if SANITIZER_FREEBSD
743   // On FreeBSD, retrieving the argument and environment arrays is done via the
744   // kern.ps_strings sysctl, which returns a pointer to a structure containing
745   // this information. See also <sys/exec.h>.
746   ps_strings *pss;
747   uptr sz = sizeof(pss);
748   if (internal_sysctlbyname("kern.ps_strings", &pss, &sz, NULL, 0) == -1) {
749     Printf("sysctl kern.ps_strings failed\n");
750     Die();
751   }
752   *argv = pss->ps_argvstr;
753   *envp = pss->ps_envstr;
754 #  elif SANITIZER_NETBSD
755   *argv = __ps_strings->ps_argvstr;
756   *envp = __ps_strings->ps_envstr;
757 #  else  // SANITIZER_FREEBSD
758 #    if !SANITIZER_GO
759   if (&__libc_stack_end) {
760     uptr *stack_end = (uptr *)__libc_stack_end;
761     // Linux/sparc64 needs an adjustment, cf. glibc
762     // sysdeps/sparc/sparc{32,64}/dl-machine.h (DL_STACK_END).
763 #      if SANITIZER_LINUX && defined(__sparc__)
764     stack_end = &stack_end[16];
765 #      endif
766     // Normally argc can be obtained from *stack_end, however, on ARM glibc's
767     // _start clobbers it:
768     // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/arm/start.S;hb=refs/heads/release/2.31/master#l75
769     // Do not special-case ARM and infer argc from argv everywhere.
770     int argc = 0;
771     while (stack_end[argc + 1]) argc++;
772     *argv = (char **)(stack_end + 1);
773     *envp = (char **)(stack_end + argc + 2);
774   } else {
775 #    endif  // !SANITIZER_GO
776     static const int kMaxArgv = 2000, kMaxEnvp = 2000;
777     ReadNullSepFileToArray("/proc/self/cmdline", argv, kMaxArgv);
778     ReadNullSepFileToArray("/proc/self/environ", envp, kMaxEnvp);
779 #    if !SANITIZER_GO
780   }
781 #    endif  // !SANITIZER_GO
782 #  endif    // SANITIZER_FREEBSD
783 }
784 
785 char **GetArgv() {
786   char **argv, **envp;
787   GetArgsAndEnv(&argv, &envp);
788   return argv;
789 }
790 
791 char **GetEnviron() {
792   char **argv, **envp;
793   GetArgsAndEnv(&argv, &envp);
794   return envp;
795 }
796 
797 #  if !SANITIZER_SOLARIS
798 void FutexWait(atomic_uint32_t *p, u32 cmp) {
799 #    if SANITIZER_FREEBSD
800   _umtx_op(p, UMTX_OP_WAIT_UINT, cmp, 0, 0);
801 #    elif SANITIZER_NETBSD
802   sched_yield(); /* No userspace futex-like synchronization */
803 #    else
804   internal_syscall(SYSCALL(futex), (uptr)p, FUTEX_WAIT_PRIVATE, cmp, 0, 0, 0);
805 #    endif
806 }
807 
808 void FutexWake(atomic_uint32_t *p, u32 count) {
809 #    if SANITIZER_FREEBSD
810   _umtx_op(p, UMTX_OP_WAKE, count, 0, 0);
811 #    elif SANITIZER_NETBSD
812   /* No userspace futex-like synchronization */
813 #    else
814   internal_syscall(SYSCALL(futex), (uptr)p, FUTEX_WAKE_PRIVATE, count, 0, 0, 0);
815 #    endif
816 }
817 
818 #  endif  // !SANITIZER_SOLARIS
819 
820 // ----------------- sanitizer_linux.h
821 // The actual size of this structure is specified by d_reclen.
822 // Note that getdents64 uses a different structure format. We only provide the
823 // 32-bit syscall here.
824 #  if SANITIZER_NETBSD
825 // Not used
826 #  else
827 struct linux_dirent {
828 #    if SANITIZER_X32 || SANITIZER_LINUX
829   u64 d_ino;
830   u64 d_off;
831 #    else
832   unsigned long d_ino;
833   unsigned long d_off;
834 #    endif
835   unsigned short d_reclen;
836 #    if SANITIZER_LINUX
837   unsigned char d_type;
838 #    endif
839   char d_name[256];
840 };
841 #  endif
842 
843 #  if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
844 // Syscall wrappers.
845 uptr internal_ptrace(int request, int pid, void *addr, void *data) {
846   return internal_syscall(SYSCALL(ptrace), request, pid, (uptr)addr,
847                           (uptr)data);
848 }
849 
850 uptr internal_waitpid(int pid, int *status, int options) {
851   return internal_syscall(SYSCALL(wait4), pid, (uptr)status, options,
852                           0 /* rusage */);
853 }
854 
855 uptr internal_getpid() { return internal_syscall(SYSCALL(getpid)); }
856 
857 uptr internal_getppid() { return internal_syscall(SYSCALL(getppid)); }
858 
859 int internal_dlinfo(void *handle, int request, void *p) {
860 #    if SANITIZER_FREEBSD
861   return dlinfo(handle, request, p);
862 #    else
863   UNIMPLEMENTED();
864 #    endif
865 }
866 
867 uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) {
868 #    if SANITIZER_FREEBSD
869   return internal_syscall(SYSCALL(getdirentries), fd, (uptr)dirp, count, NULL);
870 #    elif SANITIZER_LINUX
871   return internal_syscall(SYSCALL(getdents64), fd, (uptr)dirp, count);
872 #    else
873   return internal_syscall(SYSCALL(getdents), fd, (uptr)dirp, count);
874 #    endif
875 }
876 
877 uptr internal_lseek(fd_t fd, OFF_T offset, int whence) {
878   return internal_syscall(SYSCALL(lseek), fd, offset, whence);
879 }
880 
881 #    if SANITIZER_LINUX
882 uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5) {
883   return internal_syscall(SYSCALL(prctl), option, arg2, arg3, arg4, arg5);
884 }
885 #      if defined(__x86_64__)
886 #        include <asm/unistd_64.h>
887 // Currently internal_arch_prctl() is only needed on x86_64.
888 uptr internal_arch_prctl(int option, uptr arg2) {
889   return internal_syscall(__NR_arch_prctl, option, arg2);
890 }
891 #      endif
892 #    endif
893 
894 uptr internal_sigaltstack(const void *ss, void *oss) {
895   return internal_syscall(SYSCALL(sigaltstack), (uptr)ss, (uptr)oss);
896 }
897 
898 extern "C" pid_t __fork(void);
899 
900 int internal_fork() {
901 #    if SANITIZER_LINUX
902 #      if SANITIZER_S390
903   return internal_syscall(SYSCALL(clone), 0, SIGCHLD);
904 #      elif SANITIZER_SPARC
905   // The clone syscall interface on SPARC differs massively from the rest,
906   // so fall back to __fork.
907   return __fork();
908 #      else
909   return internal_syscall(SYSCALL(clone), SIGCHLD, 0);
910 #      endif
911 #    else
912   return internal_syscall(SYSCALL(fork));
913 #    endif
914 }
915 
916 #    if SANITIZER_FREEBSD
917 int internal_sysctl(const int *name, unsigned int namelen, void *oldp,
918                     uptr *oldlenp, const void *newp, uptr newlen) {
919   return internal_syscall(SYSCALL(__sysctl), name, namelen, oldp,
920                           (size_t *)oldlenp, newp, (size_t)newlen);
921 }
922 
923 int internal_sysctlbyname(const char *sname, void *oldp, uptr *oldlenp,
924                           const void *newp, uptr newlen) {
925   // Note: this function can be called during startup, so we need to avoid
926   // calling any interceptable functions. On FreeBSD >= 1300045 sysctlbyname()
927   // is a real syscall, but for older versions it calls sysctlnametomib()
928   // followed by sysctl(). To avoid calling the intercepted version and
929   // asserting if this happens during startup, call the real sysctlnametomib()
930   // followed by internal_sysctl() if the syscall is not available.
931 #      ifdef SYS___sysctlbyname
932   return internal_syscall(SYSCALL(__sysctlbyname), sname,
933                           internal_strlen(sname), oldp, (size_t *)oldlenp, newp,
934                           (size_t)newlen);
935 #      else
936   static decltype(sysctlnametomib) *real_sysctlnametomib = nullptr;
937   if (!real_sysctlnametomib)
938     real_sysctlnametomib =
939         (decltype(sysctlnametomib) *)dlsym(RTLD_NEXT, "sysctlnametomib");
940   CHECK(real_sysctlnametomib);
941 
942   int oid[CTL_MAXNAME];
943   size_t len = CTL_MAXNAME;
944   if (real_sysctlnametomib(sname, oid, &len) == -1)
945     return (-1);
946   return internal_sysctl(oid, len, oldp, oldlenp, newp, newlen);
947 #      endif
948 }
949 #    endif
950 
951 #    if SANITIZER_LINUX
952 #      define SA_RESTORER 0x04000000
953 // Doesn't set sa_restorer if the caller did not set it, so use with caution
954 //(see below).
955 int internal_sigaction_norestorer(int signum, const void *act, void *oldact) {
956   __sanitizer_kernel_sigaction_t k_act, k_oldact;
957   internal_memset(&k_act, 0, sizeof(__sanitizer_kernel_sigaction_t));
958   internal_memset(&k_oldact, 0, sizeof(__sanitizer_kernel_sigaction_t));
959   const __sanitizer_sigaction *u_act = (const __sanitizer_sigaction *)act;
960   __sanitizer_sigaction *u_oldact = (__sanitizer_sigaction *)oldact;
961   if (u_act) {
962     k_act.handler = u_act->handler;
963     k_act.sigaction = u_act->sigaction;
964     internal_memcpy(&k_act.sa_mask, &u_act->sa_mask,
965                     sizeof(__sanitizer_kernel_sigset_t));
966     // Without SA_RESTORER kernel ignores the calls (probably returns EINVAL).
967     k_act.sa_flags = u_act->sa_flags | SA_RESTORER;
968     // FIXME: most often sa_restorer is unset, however the kernel requires it
969     // to point to a valid signal restorer that calls the rt_sigreturn syscall.
970     // If sa_restorer passed to the kernel is NULL, the program may crash upon
971     // signal delivery or fail to unwind the stack in the signal handler.
972     // libc implementation of sigaction() passes its own restorer to
973     // rt_sigaction, so we need to do the same (we'll need to reimplement the
974     // restorers; for x86_64 the restorer address can be obtained from
975     // oldact->sa_restorer upon a call to sigaction(xxx, NULL, oldact).
976 #      if !SANITIZER_ANDROID || !SANITIZER_MIPS32
977     k_act.sa_restorer = u_act->sa_restorer;
978 #      endif
979   }
980 
981   uptr result = internal_syscall(SYSCALL(rt_sigaction), (uptr)signum,
982                                  (uptr)(u_act ? &k_act : nullptr),
983                                  (uptr)(u_oldact ? &k_oldact : nullptr),
984                                  (uptr)sizeof(__sanitizer_kernel_sigset_t));
985 
986   if ((result == 0) && u_oldact) {
987     u_oldact->handler = k_oldact.handler;
988     u_oldact->sigaction = k_oldact.sigaction;
989     internal_memcpy(&u_oldact->sa_mask, &k_oldact.sa_mask,
990                     sizeof(__sanitizer_kernel_sigset_t));
991     u_oldact->sa_flags = k_oldact.sa_flags;
992 #      if !SANITIZER_ANDROID || !SANITIZER_MIPS32
993     u_oldact->sa_restorer = k_oldact.sa_restorer;
994 #      endif
995   }
996   return result;
997 }
998 #    endif  // SANITIZER_LINUX
999 
1000 uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
1001                           __sanitizer_sigset_t *oldset) {
1002 #    if SANITIZER_FREEBSD
1003   return internal_syscall(SYSCALL(sigprocmask), how, set, oldset);
1004 #    else
1005   __sanitizer_kernel_sigset_t *k_set = (__sanitizer_kernel_sigset_t *)set;
1006   __sanitizer_kernel_sigset_t *k_oldset = (__sanitizer_kernel_sigset_t *)oldset;
1007   return internal_syscall(SYSCALL(rt_sigprocmask), (uptr)how, (uptr)k_set,
1008                           (uptr)k_oldset, sizeof(__sanitizer_kernel_sigset_t));
1009 #    endif
1010 }
1011 
1012 void internal_sigfillset(__sanitizer_sigset_t *set) {
1013   internal_memset(set, 0xff, sizeof(*set));
1014 }
1015 
1016 void internal_sigemptyset(__sanitizer_sigset_t *set) {
1017   internal_memset(set, 0, sizeof(*set));
1018 }
1019 
1020 #    if SANITIZER_LINUX
1021 void internal_sigdelset(__sanitizer_sigset_t *set, int signum) {
1022   signum -= 1;
1023   CHECK_GE(signum, 0);
1024   CHECK_LT(signum, sizeof(*set) * 8);
1025   __sanitizer_kernel_sigset_t *k_set = (__sanitizer_kernel_sigset_t *)set;
1026   const uptr idx = signum / (sizeof(k_set->sig[0]) * 8);
1027   const uptr bit = signum % (sizeof(k_set->sig[0]) * 8);
1028   k_set->sig[idx] &= ~((uptr)1 << bit);
1029 }
1030 
1031 bool internal_sigismember(__sanitizer_sigset_t *set, int signum) {
1032   signum -= 1;
1033   CHECK_GE(signum, 0);
1034   CHECK_LT(signum, sizeof(*set) * 8);
1035   __sanitizer_kernel_sigset_t *k_set = (__sanitizer_kernel_sigset_t *)set;
1036   const uptr idx = signum / (sizeof(k_set->sig[0]) * 8);
1037   const uptr bit = signum % (sizeof(k_set->sig[0]) * 8);
1038   return k_set->sig[idx] & ((uptr)1 << bit);
1039 }
1040 #    elif SANITIZER_FREEBSD
1041 uptr internal_procctl(int type, int id, int cmd, void *data) {
1042   return internal_syscall(SYSCALL(procctl), type, id, cmd, data);
1043 }
1044 
1045 void internal_sigdelset(__sanitizer_sigset_t *set, int signum) {
1046   sigset_t *rset = reinterpret_cast<sigset_t *>(set);
1047   sigdelset(rset, signum);
1048 }
1049 
1050 bool internal_sigismember(__sanitizer_sigset_t *set, int signum) {
1051   sigset_t *rset = reinterpret_cast<sigset_t *>(set);
1052   return sigismember(rset, signum);
1053 }
1054 #    endif
1055 #  endif  // !SANITIZER_SOLARIS
1056 
1057 #  if !SANITIZER_NETBSD
1058 // ThreadLister implementation.
1059 ThreadLister::ThreadLister(pid_t pid) : buffer_(4096) {
1060   task_path_.AppendF("/proc/%d/task", pid);
1061 }
1062 
1063 ThreadLister::Result ThreadLister::ListThreads(
1064     InternalMmapVector<tid_t> *threads) {
1065   int descriptor = internal_open(task_path_.data(), O_RDONLY | O_DIRECTORY);
1066   if (internal_iserror(descriptor)) {
1067     Report("Can't open %s for reading.\n", task_path_.data());
1068     return Error;
1069   }
1070   auto cleanup = at_scope_exit([&] { internal_close(descriptor); });
1071   threads->clear();
1072 
1073   Result result = Ok;
1074   for (bool first_read = true;; first_read = false) {
1075     CHECK_GE(buffer_.size(), 4096);
1076     uptr read = internal_getdents(
1077         descriptor, (struct linux_dirent *)buffer_.data(), buffer_.size());
1078     if (!read)
1079       return result;
1080     if (internal_iserror(read)) {
1081       Report("Can't read directory entries from %s.\n", task_path_.data());
1082       return Error;
1083     }
1084 
1085     for (uptr begin = (uptr)buffer_.data(), end = begin + read; begin < end;) {
1086       struct linux_dirent *entry = (struct linux_dirent *)begin;
1087       begin += entry->d_reclen;
1088       if (entry->d_ino == 1) {
1089         // Inode 1 is for bad blocks and also can be a reason for early return.
1090         // Should be emitted if kernel tried to output terminating thread.
1091         // See proc_task_readdir implementation in Linux.
1092         result = Incomplete;
1093       }
1094       if (entry->d_ino && *entry->d_name >= '0' && *entry->d_name <= '9')
1095         threads->push_back(internal_atoll(entry->d_name));
1096     }
1097 
1098     // Now we are going to detect short-read or early EOF. In such cases Linux
1099     // can return inconsistent list with missing alive threads.
1100     // Code will just remember that the list can be incomplete but it will
1101     // continue reads to return as much as possible.
1102     if (!first_read) {
1103       // The first one was a short-read by definition.
1104       result = Incomplete;
1105     } else if (read > buffer_.size() - 1024) {
1106       // Read was close to the buffer size. So double the size and assume the
1107       // worst.
1108       buffer_.resize(buffer_.size() * 2);
1109       result = Incomplete;
1110     } else if (!threads->empty() && !IsAlive(threads->back())) {
1111       // Maybe Linux early returned from read on terminated thread (!pid_alive)
1112       // and failed to restore read position.
1113       // See next_tid and proc_task_instantiate in Linux.
1114       result = Incomplete;
1115     }
1116   }
1117 }
1118 
1119 const char *ThreadLister::LoadStatus(tid_t tid) {
1120   status_path_.clear();
1121   status_path_.AppendF("%s/%llu/status", task_path_.data(), tid);
1122   auto cleanup = at_scope_exit([&] {
1123     // Resize back to capacity if it is downsized by `ReadFileToVector`.
1124     buffer_.resize(buffer_.capacity());
1125   });
1126   if (!ReadFileToVector(status_path_.data(), &buffer_) || buffer_.empty())
1127     return nullptr;
1128   buffer_.push_back('\0');
1129   return buffer_.data();
1130 }
1131 
1132 bool ThreadLister::IsAlive(tid_t tid) {
1133   // /proc/%d/task/%d/status uses same call to detect alive threads as
1134   // proc_task_readdir. See task_state implementation in Linux.
1135   static const char kPrefix[] = "\nPPid:";
1136   const char *status = LoadStatus(tid);
1137   if (!status)
1138     return false;
1139   const char *field = internal_strstr(status, kPrefix);
1140   if (!field)
1141     return false;
1142   field += internal_strlen(kPrefix);
1143   return (int)internal_atoll(field) != 0;
1144 }
1145 
1146 #  endif
1147 
1148 #  if SANITIZER_WORDSIZE == 32
1149 // Take care of unusable kernel area in top gigabyte.
1150 static uptr GetKernelAreaSize() {
1151 #    if SANITIZER_LINUX && !SANITIZER_X32
1152   const uptr gbyte = 1UL << 30;
1153 
1154   // Firstly check if there are writable segments
1155   // mapped to top gigabyte (e.g. stack).
1156   MemoryMappingLayout proc_maps(/*cache_enabled*/ true);
1157   if (proc_maps.Error())
1158     return 0;
1159   MemoryMappedSegment segment;
1160   while (proc_maps.Next(&segment)) {
1161     if ((segment.end >= 3 * gbyte) && segment.IsWritable())
1162       return 0;
1163   }
1164 
1165 #      if !SANITIZER_ANDROID
1166   // Even if nothing is mapped, top Gb may still be accessible
1167   // if we are running on 64-bit kernel.
1168   // Uname may report misleading results if personality type
1169   // is modified (e.g. under schroot) so check this as well.
1170   struct utsname uname_info;
1171   int pers = personality(0xffffffffUL);
1172   if (!(pers & PER_MASK) && internal_uname(&uname_info) == 0 &&
1173       internal_strstr(uname_info.machine, "64"))
1174     return 0;
1175 #      endif  // SANITIZER_ANDROID
1176 
1177   // Top gigabyte is reserved for kernel.
1178   return gbyte;
1179 #    else
1180   return 0;
1181 #    endif  // SANITIZER_LINUX && !SANITIZER_X32
1182 }
1183 #  endif  // SANITIZER_WORDSIZE == 32
1184 
1185 uptr GetMaxVirtualAddress() {
1186 #  if SANITIZER_NETBSD && defined(__x86_64__)
1187   return 0x7f7ffffff000ULL;  // (0x00007f8000000000 - PAGE_SIZE)
1188 #  elif SANITIZER_WORDSIZE == 64
1189 #    if defined(__powerpc64__) || defined(__aarch64__) || \
1190         defined(__loongarch__) || SANITIZER_RISCV64
1191   // On PowerPC64 we have two different address space layouts: 44- and 46-bit.
1192   // We somehow need to figure out which one we are using now and choose
1193   // one of 0x00000fffffffffffUL and 0x00003fffffffffffUL.
1194   // Note that with 'ulimit -s unlimited' the stack is moved away from the top
1195   // of the address space, so simply checking the stack address is not enough.
1196   // This should (does) work for both PowerPC64 Endian modes.
1197   // Similarly, aarch64 has multiple address space layouts: 39, 42 and 47-bit.
1198   // loongarch64 also has multiple address space layouts: default is 47-bit.
1199   // RISC-V 64 also has multiple address space layouts: 39, 48 and 57-bit.
1200   return (1ULL << (MostSignificantSetBitIndex(GET_CURRENT_FRAME()) + 1)) - 1;
1201 #    elif SANITIZER_MIPS64
1202   return (1ULL << 40) - 1;  // 0x000000ffffffffffUL;
1203 #    elif defined(__s390x__)
1204   return (1ULL << 53) - 1;  // 0x001fffffffffffffUL;
1205 #    elif defined(__sparc__)
1206   return ~(uptr)0;
1207 #    else
1208   return (1ULL << 47) - 1;  // 0x00007fffffffffffUL;
1209 #    endif
1210 #  else  // SANITIZER_WORDSIZE == 32
1211 #    if defined(__s390__)
1212   return (1ULL << 31) - 1;  // 0x7fffffff;
1213 #    else
1214   return (1ULL << 32) - 1;  // 0xffffffff;
1215 #    endif
1216 #  endif  // SANITIZER_WORDSIZE
1217 }
1218 
1219 uptr GetMaxUserVirtualAddress() {
1220   uptr addr = GetMaxVirtualAddress();
1221 #  if SANITIZER_WORDSIZE == 32 && !defined(__s390__)
1222   if (!common_flags()->full_address_space)
1223     addr -= GetKernelAreaSize();
1224   CHECK_LT(reinterpret_cast<uptr>(&addr), addr);
1225 #  endif
1226   return addr;
1227 }
1228 
1229 #  if !SANITIZER_ANDROID || defined(__aarch64__)
1230 uptr GetPageSize() {
1231 #    if SANITIZER_LINUX && (defined(__x86_64__) || defined(__i386__)) && \
1232         defined(EXEC_PAGESIZE)
1233   return EXEC_PAGESIZE;
1234 #    elif SANITIZER_FREEBSD || SANITIZER_NETBSD
1235   // Use sysctl as sysconf can trigger interceptors internally.
1236   int pz = 0;
1237   uptr pzl = sizeof(pz);
1238   int mib[2] = {CTL_HW, HW_PAGESIZE};
1239   int rv = internal_sysctl(mib, 2, &pz, &pzl, nullptr, 0);
1240   CHECK_EQ(rv, 0);
1241   return (uptr)pz;
1242 #    elif SANITIZER_USE_GETAUXVAL
1243   return getauxval(AT_PAGESZ);
1244 #    else
1245   return sysconf(_SC_PAGESIZE);  // EXEC_PAGESIZE may not be trustworthy.
1246 #    endif
1247 }
1248 #  endif
1249 
1250 uptr ReadBinaryName(/*out*/ char *buf, uptr buf_len) {
1251 #  if SANITIZER_SOLARIS
1252   const char *default_module_name = getexecname();
1253   CHECK_NE(default_module_name, NULL);
1254   return internal_snprintf(buf, buf_len, "%s", default_module_name);
1255 #  else
1256 #    if SANITIZER_FREEBSD || SANITIZER_NETBSD
1257 #      if SANITIZER_FREEBSD
1258   const int Mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
1259 #      else
1260   const int Mib[4] = {CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME};
1261 #      endif
1262   const char *default_module_name = "kern.proc.pathname";
1263   uptr Size = buf_len;
1264   bool IsErr =
1265       (internal_sysctl(Mib, ARRAY_SIZE(Mib), buf, &Size, NULL, 0) != 0);
1266   int readlink_error = IsErr ? errno : 0;
1267   uptr module_name_len = Size;
1268 #    else
1269   const char *default_module_name = "/proc/self/exe";
1270   uptr module_name_len = internal_readlink(default_module_name, buf, buf_len);
1271   int readlink_error;
1272   bool IsErr = internal_iserror(module_name_len, &readlink_error);
1273 #    endif
1274   if (IsErr) {
1275     // We can't read binary name for some reason, assume it's unknown.
1276     Report(
1277         "WARNING: reading executable name failed with errno %d, "
1278         "some stack frames may not be symbolized\n",
1279         readlink_error);
1280     module_name_len =
1281         internal_snprintf(buf, buf_len, "%s", default_module_name);
1282     CHECK_LT(module_name_len, buf_len);
1283   }
1284   return module_name_len;
1285 #  endif
1286 }
1287 
1288 uptr ReadLongProcessName(/*out*/ char *buf, uptr buf_len) {
1289 #  if SANITIZER_LINUX
1290   char *tmpbuf;
1291   uptr tmpsize;
1292   uptr tmplen;
1293   if (ReadFileToBuffer("/proc/self/cmdline", &tmpbuf, &tmpsize, &tmplen,
1294                        1024 * 1024)) {
1295     internal_strncpy(buf, tmpbuf, buf_len);
1296     UnmapOrDie(tmpbuf, tmpsize);
1297     return internal_strlen(buf);
1298   }
1299 #  endif
1300   return ReadBinaryName(buf, buf_len);
1301 }
1302 
1303 // Match full names of the form /path/to/base_name{-,.}*
1304 bool LibraryNameIs(const char *full_name, const char *base_name) {
1305   const char *name = full_name;
1306   // Strip path.
1307   while (*name != '\0') name++;
1308   while (name > full_name && *name != '/') name--;
1309   if (*name == '/')
1310     name++;
1311   uptr base_name_length = internal_strlen(base_name);
1312   if (internal_strncmp(name, base_name, base_name_length))
1313     return false;
1314   return (name[base_name_length] == '-' || name[base_name_length] == '.');
1315 }
1316 
1317 #  if !SANITIZER_ANDROID
1318 // Call cb for each region mapped by map.
1319 void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)) {
1320   CHECK_NE(map, nullptr);
1321 #    if !SANITIZER_FREEBSD
1322   typedef ElfW(Phdr) Elf_Phdr;
1323   typedef ElfW(Ehdr) Elf_Ehdr;
1324 #    endif  // !SANITIZER_FREEBSD
1325   char *base = (char *)map->l_addr;
1326   Elf_Ehdr *ehdr = (Elf_Ehdr *)base;
1327   char *phdrs = base + ehdr->e_phoff;
1328   char *phdrs_end = phdrs + ehdr->e_phnum * ehdr->e_phentsize;
1329 
1330   // Find the segment with the minimum base so we can "relocate" the p_vaddr
1331   // fields.  Typically ET_DYN objects (DSOs) have base of zero and ET_EXEC
1332   // objects have a non-zero base.
1333   uptr preferred_base = (uptr)-1;
1334   for (char *iter = phdrs; iter != phdrs_end; iter += ehdr->e_phentsize) {
1335     Elf_Phdr *phdr = (Elf_Phdr *)iter;
1336     if (phdr->p_type == PT_LOAD && preferred_base > (uptr)phdr->p_vaddr)
1337       preferred_base = (uptr)phdr->p_vaddr;
1338   }
1339 
1340   // Compute the delta from the real base to get a relocation delta.
1341   sptr delta = (uptr)base - preferred_base;
1342   // Now we can figure out what the loader really mapped.
1343   for (char *iter = phdrs; iter != phdrs_end; iter += ehdr->e_phentsize) {
1344     Elf_Phdr *phdr = (Elf_Phdr *)iter;
1345     if (phdr->p_type == PT_LOAD) {
1346       uptr seg_start = phdr->p_vaddr + delta;
1347       uptr seg_end = seg_start + phdr->p_memsz;
1348       // None of these values are aligned.  We consider the ragged edges of the
1349       // load command as defined, since they are mapped from the file.
1350       seg_start = RoundDownTo(seg_start, GetPageSizeCached());
1351       seg_end = RoundUpTo(seg_end, GetPageSizeCached());
1352       cb((void *)seg_start, seg_end - seg_start);
1353     }
1354   }
1355 }
1356 #  endif
1357 
1358 #  if SANITIZER_LINUX
1359 #    if defined(__x86_64__)
1360 // We cannot use glibc's clone wrapper, because it messes with the child
1361 // task's TLS. It writes the PID and TID of the child task to its thread
1362 // descriptor, but in our case the child task shares the thread descriptor with
1363 // the parent (because we don't know how to allocate a new thread
1364 // descriptor to keep glibc happy). So the stock version of clone(), when
1365 // used with CLONE_VM, would end up corrupting the parent's thread descriptor.
1366 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1367                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1368   long long res;
1369   if (!fn || !child_stack)
1370     return -EINVAL;
1371   CHECK_EQ(0, (uptr)child_stack % 16);
1372   child_stack = (char *)child_stack - 2 * sizeof(unsigned long long);
1373   ((unsigned long long *)child_stack)[0] = (uptr)fn;
1374   ((unsigned long long *)child_stack)[1] = (uptr)arg;
1375   register void *r8 __asm__("r8") = newtls;
1376   register int *r10 __asm__("r10") = child_tidptr;
1377   __asm__ __volatile__(
1378       /* %rax = syscall(%rax = SYSCALL(clone),
1379        *                %rdi = flags,
1380        *                %rsi = child_stack,
1381        *                %rdx = parent_tidptr,
1382        *                %r8  = new_tls,
1383        *                %r10 = child_tidptr)
1384        */
1385       "syscall\n"
1386 
1387       /* if (%rax != 0)
1388        *   return;
1389        */
1390       "testq  %%rax,%%rax\n"
1391       "jnz    1f\n"
1392 
1393       /* In the child. Terminate unwind chain. */
1394       // XXX: We should also terminate the CFI unwind chain
1395       // here. Unfortunately clang 3.2 doesn't support the
1396       // necessary CFI directives, so we skip that part.
1397       "xorq   %%rbp,%%rbp\n"
1398 
1399       /* Call "fn(arg)". */
1400       "popq   %%rax\n"
1401       "popq   %%rdi\n"
1402       "call   *%%rax\n"
1403 
1404       /* Call _exit(%rax). */
1405       "movq   %%rax,%%rdi\n"
1406       "movq   %2,%%rax\n"
1407       "syscall\n"
1408 
1409       /* Return to parent. */
1410       "1:\n"
1411       : "=a"(res)
1412       : "a"(SYSCALL(clone)), "i"(SYSCALL(exit)), "S"(child_stack), "D"(flags),
1413         "d"(parent_tidptr), "r"(r8), "r"(r10)
1414       : "memory", "r11", "rcx");
1415   return res;
1416 }
1417 #    elif defined(__mips__)
1418 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1419                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1420   long long res;
1421   if (!fn || !child_stack)
1422     return -EINVAL;
1423   CHECK_EQ(0, (uptr)child_stack % 16);
1424   child_stack = (char *)child_stack - 2 * sizeof(unsigned long long);
1425   ((unsigned long long *)child_stack)[0] = (uptr)fn;
1426   ((unsigned long long *)child_stack)[1] = (uptr)arg;
1427   register void *a3 __asm__("$7") = newtls;
1428   register int *a4 __asm__("$8") = child_tidptr;
1429   // We don't have proper CFI directives here because it requires alot of code
1430   // for very marginal benefits.
1431   __asm__ __volatile__(
1432       /* $v0 = syscall($v0 = __NR_clone,
1433        * $a0 = flags,
1434        * $a1 = child_stack,
1435        * $a2 = parent_tidptr,
1436        * $a3 = new_tls,
1437        * $a4 = child_tidptr)
1438        */
1439       ".cprestore 16;\n"
1440       "move $4,%1;\n"
1441       "move $5,%2;\n"
1442       "move $6,%3;\n"
1443       "move $7,%4;\n"
1444   /* Store the fifth argument on stack
1445    * if we are using 32-bit abi.
1446    */
1447 #      if SANITIZER_WORDSIZE == 32
1448       "lw %5,16($29);\n"
1449 #      else
1450       "move $8,%5;\n"
1451 #      endif
1452       "li $2,%6;\n"
1453       "syscall;\n"
1454 
1455       /* if ($v0 != 0)
1456        * return;
1457        */
1458       "bnez $2,1f;\n"
1459 
1460   /* Call "fn(arg)". */
1461 #      if SANITIZER_WORDSIZE == 32
1462 #        ifdef __BIG_ENDIAN__
1463       "lw $25,4($29);\n"
1464       "lw $4,12($29);\n"
1465 #        else
1466       "lw $25,0($29);\n"
1467       "lw $4,8($29);\n"
1468 #        endif
1469 #      else
1470       "ld $25,0($29);\n"
1471       "ld $4,8($29);\n"
1472 #      endif
1473       "jal $25;\n"
1474 
1475       /* Call _exit($v0). */
1476       "move $4,$2;\n"
1477       "li $2,%7;\n"
1478       "syscall;\n"
1479 
1480       /* Return to parent. */
1481       "1:\n"
1482       : "=r"(res)
1483       : "r"(flags), "r"(child_stack), "r"(parent_tidptr), "r"(a3), "r"(a4),
1484         "i"(__NR_clone), "i"(__NR_exit)
1485       : "memory", "$29");
1486   return res;
1487 }
1488 #    elif SANITIZER_RISCV64
1489 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1490                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1491   if (!fn || !child_stack)
1492     return -EINVAL;
1493 
1494   CHECK_EQ(0, (uptr)child_stack % 16);
1495 
1496   register int res __asm__("a0");
1497   register int __flags __asm__("a0") = flags;
1498   register void *__stack __asm__("a1") = child_stack;
1499   register int *__ptid __asm__("a2") = parent_tidptr;
1500   register void *__tls __asm__("a3") = newtls;
1501   register int *__ctid __asm__("a4") = child_tidptr;
1502   register int (*__fn)(void *) __asm__("a5") = fn;
1503   register void *__arg __asm__("a6") = arg;
1504   register int nr_clone __asm__("a7") = __NR_clone;
1505 
1506   __asm__ __volatile__(
1507       "ecall\n"
1508 
1509       /* if (a0 != 0)
1510        *   return a0;
1511        */
1512       "bnez a0, 1f\n"
1513 
1514       // In the child, now. Call "fn(arg)".
1515       "mv a0, a6\n"
1516       "jalr a5\n"
1517 
1518       // Call _exit(a0).
1519       "addi a7, zero, %9\n"
1520       "ecall\n"
1521       "1:\n"
1522 
1523       : "=r"(res)
1524       : "0"(__flags), "r"(__stack), "r"(__ptid), "r"(__tls), "r"(__ctid),
1525         "r"(__fn), "r"(__arg), "r"(nr_clone), "i"(__NR_exit)
1526       : "memory");
1527   return res;
1528 }
1529 #    elif defined(__aarch64__)
1530 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1531                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1532   register long long res __asm__("x0");
1533   if (!fn || !child_stack)
1534     return -EINVAL;
1535   CHECK_EQ(0, (uptr)child_stack % 16);
1536   child_stack = (char *)child_stack - 2 * sizeof(unsigned long long);
1537   ((unsigned long long *)child_stack)[0] = (uptr)fn;
1538   ((unsigned long long *)child_stack)[1] = (uptr)arg;
1539 
1540   register int (*__fn)(void *) __asm__("x0") = fn;
1541   register void *__stack __asm__("x1") = child_stack;
1542   register int __flags __asm__("x2") = flags;
1543   register void *__arg __asm__("x3") = arg;
1544   register int *__ptid __asm__("x4") = parent_tidptr;
1545   register void *__tls __asm__("x5") = newtls;
1546   register int *__ctid __asm__("x6") = child_tidptr;
1547 
1548   __asm__ __volatile__(
1549       "mov x0,x2\n" /* flags  */
1550       "mov x2,x4\n" /* ptid  */
1551       "mov x3,x5\n" /* tls  */
1552       "mov x4,x6\n" /* ctid  */
1553       "mov x8,%9\n" /* clone  */
1554 
1555       "svc 0x0\n"
1556 
1557       /* if (%r0 != 0)
1558        *   return %r0;
1559        */
1560       "cmp x0, #0\n"
1561       "bne 1f\n"
1562 
1563       /* In the child, now. Call "fn(arg)". */
1564       "ldp x1, x0, [sp], #16\n"
1565       "blr x1\n"
1566 
1567       /* Call _exit(%r0).  */
1568       "mov x8, %10\n"
1569       "svc 0x0\n"
1570       "1:\n"
1571 
1572       : "=r"(res)
1573       : "i"(-EINVAL), "r"(__fn), "r"(__stack), "r"(__flags), "r"(__arg),
1574         "r"(__ptid), "r"(__tls), "r"(__ctid), "i"(__NR_clone), "i"(__NR_exit)
1575       : "x30", "memory");
1576   return res;
1577 }
1578 #    elif SANITIZER_LOONGARCH64
1579 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1580                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1581   if (!fn || !child_stack)
1582     return -EINVAL;
1583 
1584   CHECK_EQ(0, (uptr)child_stack % 16);
1585 
1586   register int res __asm__("$a0");
1587   register int __flags __asm__("$a0") = flags;
1588   register void *__stack __asm__("$a1") = child_stack;
1589   register int *__ptid __asm__("$a2") = parent_tidptr;
1590   register int *__ctid __asm__("$a3") = child_tidptr;
1591   register void *__tls __asm__("$a4") = newtls;
1592   register int (*__fn)(void *) __asm__("$a5") = fn;
1593   register void *__arg __asm__("$a6") = arg;
1594   register int nr_clone __asm__("$a7") = __NR_clone;
1595 
1596   __asm__ __volatile__(
1597       "syscall 0\n"
1598 
1599       // if ($a0 != 0)
1600       //   return $a0;
1601       "bnez $a0, 1f\n"
1602 
1603       // In the child, now. Call "fn(arg)".
1604       "move $a0, $a6\n"
1605       "jirl $ra, $a5, 0\n"
1606 
1607       // Call _exit($a0).
1608       "addi.d $a7, $zero, %9\n"
1609       "syscall 0\n"
1610 
1611       "1:\n"
1612 
1613       : "=r"(res)
1614       : "0"(__flags), "r"(__stack), "r"(__ptid), "r"(__ctid), "r"(__tls),
1615         "r"(__fn), "r"(__arg), "r"(nr_clone), "i"(__NR_exit)
1616       : "memory", "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
1617         "$t8");
1618   return res;
1619 }
1620 #    elif defined(__powerpc64__)
1621 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1622                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1623   long long res;
1624 // Stack frame structure.
1625 #      if SANITIZER_PPC64V1
1626   //   Back chain == 0        (SP + 112)
1627   // Frame (112 bytes):
1628   //   Parameter save area    (SP + 48), 8 doublewords
1629   //   TOC save area          (SP + 40)
1630   //   Link editor doubleword (SP + 32)
1631   //   Compiler doubleword    (SP + 24)
1632   //   LR save area           (SP + 16)
1633   //   CR save area           (SP + 8)
1634   //   Back chain             (SP + 0)
1635 #        define FRAME_SIZE 112
1636 #        define FRAME_TOC_SAVE_OFFSET 40
1637 #      elif SANITIZER_PPC64V2
1638   //   Back chain == 0        (SP + 32)
1639   // Frame (32 bytes):
1640   //   TOC save area          (SP + 24)
1641   //   LR save area           (SP + 16)
1642   //   CR save area           (SP + 8)
1643   //   Back chain             (SP + 0)
1644 #        define FRAME_SIZE 32
1645 #        define FRAME_TOC_SAVE_OFFSET 24
1646 #      else
1647 #        error "Unsupported PPC64 ABI"
1648 #      endif
1649   if (!fn || !child_stack)
1650     return -EINVAL;
1651   CHECK_EQ(0, (uptr)child_stack % 16);
1652 
1653   register int (*__fn)(void *) __asm__("r3") = fn;
1654   register void *__cstack __asm__("r4") = child_stack;
1655   register int __flags __asm__("r5") = flags;
1656   register void *__arg __asm__("r6") = arg;
1657   register int *__ptidptr __asm__("r7") = parent_tidptr;
1658   register void *__newtls __asm__("r8") = newtls;
1659   register int *__ctidptr __asm__("r9") = child_tidptr;
1660 
1661   __asm__ __volatile__(
1662       /* fn and arg are saved across the syscall */
1663       "mr 28, %5\n\t"
1664       "mr 27, %8\n\t"
1665 
1666       /* syscall
1667         r0 == __NR_clone
1668         r3 == flags
1669         r4 == child_stack
1670         r5 == parent_tidptr
1671         r6 == newtls
1672         r7 == child_tidptr */
1673       "mr 3, %7\n\t"
1674       "mr 5, %9\n\t"
1675       "mr 6, %10\n\t"
1676       "mr 7, %11\n\t"
1677       "li 0, %3\n\t"
1678       "sc\n\t"
1679 
1680       /* Test if syscall was successful */
1681       "cmpdi  cr1, 3, 0\n\t"
1682       "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t"
1683       "bne-   cr1, 1f\n\t"
1684 
1685       /* Set up stack frame */
1686       "li    29, 0\n\t"
1687       "stdu  29, -8(1)\n\t"
1688       "stdu  1, -%12(1)\n\t"
1689       /* Do the function call */
1690       "std   2, %13(1)\n\t"
1691 #      if SANITIZER_PPC64V1
1692       "ld    0, 0(28)\n\t"
1693       "ld    2, 8(28)\n\t"
1694       "mtctr 0\n\t"
1695 #      elif SANITIZER_PPC64V2
1696       "mr    12, 28\n\t"
1697       "mtctr 12\n\t"
1698 #      else
1699 #        error "Unsupported PPC64 ABI"
1700 #      endif
1701       "mr    3, 27\n\t"
1702       "bctrl\n\t"
1703       "ld    2, %13(1)\n\t"
1704 
1705       /* Call _exit(r3) */
1706       "li 0, %4\n\t"
1707       "sc\n\t"
1708 
1709       /* Return to parent */
1710       "1:\n\t"
1711       "mr %0, 3\n\t"
1712       : "=r"(res)
1713       : "0"(-1), "i"(EINVAL), "i"(__NR_clone), "i"(__NR_exit), "r"(__fn),
1714         "r"(__cstack), "r"(__flags), "r"(__arg), "r"(__ptidptr), "r"(__newtls),
1715         "r"(__ctidptr), "i"(FRAME_SIZE), "i"(FRAME_TOC_SAVE_OFFSET)
1716       : "cr0", "cr1", "memory", "ctr", "r0", "r27", "r28", "r29");
1717   return res;
1718 }
1719 #    elif defined(__i386__)
1720 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1721                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1722   int res;
1723   if (!fn || !child_stack)
1724     return -EINVAL;
1725   CHECK_EQ(0, (uptr)child_stack % 16);
1726   child_stack = (char *)child_stack - 7 * sizeof(unsigned int);
1727   ((unsigned int *)child_stack)[0] = (uptr)flags;
1728   ((unsigned int *)child_stack)[1] = (uptr)0;
1729   ((unsigned int *)child_stack)[2] = (uptr)fn;
1730   ((unsigned int *)child_stack)[3] = (uptr)arg;
1731   __asm__ __volatile__(
1732       /* %eax = syscall(%eax = SYSCALL(clone),
1733        *                %ebx = flags,
1734        *                %ecx = child_stack,
1735        *                %edx = parent_tidptr,
1736        *                %esi  = new_tls,
1737        *                %edi = child_tidptr)
1738        */
1739 
1740       /* Obtain flags */
1741       "movl    (%%ecx), %%ebx\n"
1742       /* Do the system call */
1743       "pushl   %%ebx\n"
1744       "pushl   %%esi\n"
1745       "pushl   %%edi\n"
1746       /* Remember the flag value.  */
1747       "movl    %%ebx, (%%ecx)\n"
1748       "int     $0x80\n"
1749       "popl    %%edi\n"
1750       "popl    %%esi\n"
1751       "popl    %%ebx\n"
1752 
1753       /* if (%eax != 0)
1754        *   return;
1755        */
1756 
1757       "test    %%eax,%%eax\n"
1758       "jnz    1f\n"
1759 
1760       /* terminate the stack frame */
1761       "xorl   %%ebp,%%ebp\n"
1762       /* Call FN. */
1763       "call    *%%ebx\n"
1764 #      ifdef PIC
1765       "call    here\n"
1766       "here:\n"
1767       "popl    %%ebx\n"
1768       "addl    $_GLOBAL_OFFSET_TABLE_+[.-here], %%ebx\n"
1769 #      endif
1770       /* Call exit */
1771       "movl    %%eax, %%ebx\n"
1772       "movl    %2, %%eax\n"
1773       "int     $0x80\n"
1774       "1:\n"
1775       : "=a"(res)
1776       : "a"(SYSCALL(clone)), "i"(SYSCALL(exit)), "c"(child_stack),
1777         "d"(parent_tidptr), "S"(newtls), "D"(child_tidptr)
1778       : "memory");
1779   return res;
1780 }
1781 #    elif defined(__arm__)
1782 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
1783                     int *parent_tidptr, void *newtls, int *child_tidptr) {
1784   unsigned int res;
1785   if (!fn || !child_stack)
1786     return -EINVAL;
1787   child_stack = (char *)child_stack - 2 * sizeof(unsigned int);
1788   ((unsigned int *)child_stack)[0] = (uptr)fn;
1789   ((unsigned int *)child_stack)[1] = (uptr)arg;
1790   register int r0 __asm__("r0") = flags;
1791   register void *r1 __asm__("r1") = child_stack;
1792   register int *r2 __asm__("r2") = parent_tidptr;
1793   register void *r3 __asm__("r3") = newtls;
1794   register int *r4 __asm__("r4") = child_tidptr;
1795   register int r7 __asm__("r7") = __NR_clone;
1796 
1797 #      if __ARM_ARCH > 4 || defined(__ARM_ARCH_4T__)
1798 #        define ARCH_HAS_BX
1799 #      endif
1800 #      if __ARM_ARCH > 4
1801 #        define ARCH_HAS_BLX
1802 #      endif
1803 
1804 #      ifdef ARCH_HAS_BX
1805 #        ifdef ARCH_HAS_BLX
1806 #          define BLX(R) "blx " #R "\n"
1807 #        else
1808 #          define BLX(R) "mov lr, pc; bx " #R "\n"
1809 #        endif
1810 #      else
1811 #        define BLX(R) "mov lr, pc; mov pc," #R "\n"
1812 #      endif
1813 
1814   __asm__ __volatile__(
1815       /* %r0 = syscall(%r7 = SYSCALL(clone),
1816        *               %r0 = flags,
1817        *               %r1 = child_stack,
1818        *               %r2 = parent_tidptr,
1819        *               %r3  = new_tls,
1820        *               %r4 = child_tidptr)
1821        */
1822 
1823       /* Do the system call */
1824       "swi 0x0\n"
1825 
1826       /* if (%r0 != 0)
1827        *   return %r0;
1828        */
1829       "cmp r0, #0\n"
1830       "bne 1f\n"
1831 
1832       /* In the child, now. Call "fn(arg)". */
1833       "ldr r0, [sp, #4]\n"
1834       "ldr ip, [sp], #8\n" BLX(ip)
1835       /* Call _exit(%r0). */
1836       "mov r7, %7\n"
1837       "swi 0x0\n"
1838       "1:\n"
1839       "mov %0, r0\n"
1840       : "=r"(res)
1841       : "r"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r7), "i"(__NR_exit)
1842       : "memory");
1843   return res;
1844 }
1845 #    endif
1846 #  endif  // SANITIZER_LINUX
1847 
1848 #  if SANITIZER_LINUX
1849 int internal_uname(struct utsname *buf) {
1850   return internal_syscall(SYSCALL(uname), buf);
1851 }
1852 #  endif
1853 
1854 #  if SANITIZER_ANDROID
1855 static int dl_iterate_phdr_test_cb(struct dl_phdr_info *info, size_t size,
1856                                    void *data) {
1857   // Any name starting with "lib" indicates a bug in L where library base names
1858   // are returned instead of paths.
1859   if (info->dlpi_name && info->dlpi_name[0] == 'l' &&
1860       info->dlpi_name[1] == 'i' && info->dlpi_name[2] == 'b') {
1861     *(bool *)data = true;
1862     return 1;
1863   }
1864   return 0;
1865 }
1866 
1867 static atomic_uint32_t android_api_level;
1868 
1869 static AndroidApiLevel AndroidDetectApiLevelStatic() {
1870 #    if __ANDROID_API__ <= 22
1871   return ANDROID_LOLLIPOP_MR1;
1872 #    else
1873   return ANDROID_POST_LOLLIPOP;
1874 #    endif
1875 }
1876 
1877 static AndroidApiLevel AndroidDetectApiLevel() {
1878   bool base_name_seen = false;
1879   dl_iterate_phdr(dl_iterate_phdr_test_cb, &base_name_seen);
1880   if (base_name_seen)
1881     return ANDROID_LOLLIPOP_MR1;  // L MR1
1882   return ANDROID_POST_LOLLIPOP;   // post-L
1883   // Plain L (API level 21) is completely broken wrt ASan and not very
1884   // interesting to detect.
1885 }
1886 
1887 extern "C" __attribute__((weak)) void *_DYNAMIC;
1888 
1889 AndroidApiLevel AndroidGetApiLevel() {
1890   AndroidApiLevel level =
1891       (AndroidApiLevel)atomic_load(&android_api_level, memory_order_relaxed);
1892   if (level)
1893     return level;
1894   level = &_DYNAMIC == nullptr ? AndroidDetectApiLevelStatic()
1895                                : AndroidDetectApiLevel();
1896   atomic_store(&android_api_level, level, memory_order_relaxed);
1897   return level;
1898 }
1899 
1900 #  endif
1901 
1902 static HandleSignalMode GetHandleSignalModeImpl(int signum) {
1903   switch (signum) {
1904     case SIGABRT:
1905       return common_flags()->handle_abort;
1906     case SIGILL:
1907       return common_flags()->handle_sigill;
1908     case SIGTRAP:
1909       return common_flags()->handle_sigtrap;
1910     case SIGFPE:
1911       return common_flags()->handle_sigfpe;
1912     case SIGSEGV:
1913       return common_flags()->handle_segv;
1914     case SIGBUS:
1915       return common_flags()->handle_sigbus;
1916   }
1917   return kHandleSignalNo;
1918 }
1919 
1920 HandleSignalMode GetHandleSignalMode(int signum) {
1921   HandleSignalMode result = GetHandleSignalModeImpl(signum);
1922   if (result == kHandleSignalYes && !common_flags()->allow_user_segv_handler)
1923     return kHandleSignalExclusive;
1924   return result;
1925 }
1926 
1927 #  if !SANITIZER_GO
1928 void *internal_start_thread(void *(*func)(void *arg), void *arg) {
1929   if (&internal_pthread_create == 0)
1930     return nullptr;
1931   // Start the thread with signals blocked, otherwise it can steal user signals.
1932   ScopedBlockSignals block(nullptr);
1933   void *th;
1934   internal_pthread_create(&th, nullptr, func, arg);
1935   return th;
1936 }
1937 
1938 void internal_join_thread(void *th) {
1939   if (&internal_pthread_join)
1940     internal_pthread_join(th, nullptr);
1941 }
1942 #  else
1943 void *internal_start_thread(void *(*func)(void *), void *arg) { return 0; }
1944 
1945 void internal_join_thread(void *th) {}
1946 #  endif
1947 
1948 #  if SANITIZER_LINUX && defined(__aarch64__)
1949 // Android headers in the older NDK releases miss this definition.
1950 struct __sanitizer_esr_context {
1951   struct _aarch64_ctx head;
1952   uint64_t esr;
1953 };
1954 
1955 static bool Aarch64GetESR(ucontext_t *ucontext, u64 *esr) {
1956   static const u32 kEsrMagic = 0x45535201;
1957   u8 *aux = reinterpret_cast<u8 *>(ucontext->uc_mcontext.__reserved);
1958   while (true) {
1959     _aarch64_ctx *ctx = (_aarch64_ctx *)aux;
1960     if (ctx->size == 0)
1961       break;
1962     if (ctx->magic == kEsrMagic) {
1963       *esr = ((__sanitizer_esr_context *)ctx)->esr;
1964       return true;
1965     }
1966     aux += ctx->size;
1967   }
1968   return false;
1969 }
1970 #  elif SANITIZER_FREEBSD && defined(__aarch64__)
1971 // FreeBSD doesn't provide ESR in the ucontext.
1972 static bool Aarch64GetESR(ucontext_t *ucontext, u64 *esr) { return false; }
1973 #  endif
1974 
1975 using Context = ucontext_t;
1976 
1977 SignalContext::WriteFlag SignalContext::GetWriteFlag() const {
1978   Context *ucontext = (Context *)context;
1979 #  if defined(__x86_64__) || defined(__i386__)
1980   static const uptr PF_WRITE = 1U << 1;
1981 #    if SANITIZER_FREEBSD
1982   uptr err = ucontext->uc_mcontext.mc_err;
1983 #    elif SANITIZER_NETBSD
1984   uptr err = ucontext->uc_mcontext.__gregs[_REG_ERR];
1985 #    elif SANITIZER_SOLARIS && defined(__i386__)
1986   const int Err = 13;
1987   uptr err = ucontext->uc_mcontext.gregs[Err];
1988 #    else
1989   uptr err = ucontext->uc_mcontext.gregs[REG_ERR];
1990 #    endif  // SANITIZER_FREEBSD
1991   return err & PF_WRITE ? Write : Read;
1992 #  elif defined(__mips__)
1993   uint32_t *exception_source;
1994   uint32_t faulty_instruction;
1995   uint32_t op_code;
1996 
1997   exception_source = (uint32_t *)ucontext->uc_mcontext.pc;
1998   faulty_instruction = (uint32_t)(*exception_source);
1999 
2000   op_code = (faulty_instruction >> 26) & 0x3f;
2001 
2002   // FIXME: Add support for FPU, microMIPS, DSP, MSA memory instructions.
2003   switch (op_code) {
2004     case 0x28:  // sb
2005     case 0x29:  // sh
2006     case 0x2b:  // sw
2007     case 0x3f:  // sd
2008 #    if __mips_isa_rev < 6
2009     case 0x2c:  // sdl
2010     case 0x2d:  // sdr
2011     case 0x2a:  // swl
2012     case 0x2e:  // swr
2013 #    endif
2014       return SignalContext::Write;
2015 
2016     case 0x20:  // lb
2017     case 0x24:  // lbu
2018     case 0x21:  // lh
2019     case 0x25:  // lhu
2020     case 0x23:  // lw
2021     case 0x27:  // lwu
2022     case 0x37:  // ld
2023 #    if __mips_isa_rev < 6
2024     case 0x1a:  // ldl
2025     case 0x1b:  // ldr
2026     case 0x22:  // lwl
2027     case 0x26:  // lwr
2028 #    endif
2029       return SignalContext::Read;
2030 #    if __mips_isa_rev == 6
2031     case 0x3b:  // pcrel
2032       op_code = (faulty_instruction >> 19) & 0x3;
2033       switch (op_code) {
2034         case 0x1:  // lwpc
2035         case 0x2:  // lwupc
2036           return SignalContext::Read;
2037       }
2038 #    endif
2039   }
2040   return SignalContext::Unknown;
2041 #  elif defined(__arm__)
2042   static const uptr FSR_WRITE = 1U << 11;
2043   uptr fsr = ucontext->uc_mcontext.error_code;
2044   return fsr & FSR_WRITE ? Write : Read;
2045 #  elif defined(__aarch64__)
2046   static const u64 ESR_ELx_WNR = 1U << 6;
2047   u64 esr;
2048   if (!Aarch64GetESR(ucontext, &esr))
2049     return Unknown;
2050   return esr & ESR_ELx_WNR ? Write : Read;
2051 #  elif defined(__loongarch__)
2052   // In the musl environment, the Linux kernel uapi sigcontext.h is not
2053   // included in signal.h. To avoid missing the SC_ADDRERR_{RD,WR} macros,
2054   // copy them here. The LoongArch Linux kernel uapi is already stable,
2055   // so there's no need to worry about the value changing.
2056 #    ifndef SC_ADDRERR_RD
2057   // Address error was due to memory load
2058 #      define SC_ADDRERR_RD (1 << 30)
2059 #    endif
2060 #    ifndef SC_ADDRERR_WR
2061   // Address error was due to memory store
2062 #      define SC_ADDRERR_WR (1 << 31)
2063 #    endif
2064   u32 flags = ucontext->uc_mcontext.__flags;
2065   if (flags & SC_ADDRERR_RD)
2066     return SignalContext::Read;
2067   if (flags & SC_ADDRERR_WR)
2068     return SignalContext::Write;
2069   return SignalContext::Unknown;
2070 #  elif defined(__sparc__)
2071   // Decode the instruction to determine the access type.
2072   // From OpenSolaris $SRC/uts/sun4/os/trap.c (get_accesstype).
2073 #    if SANITIZER_SOLARIS
2074   uptr pc = ucontext->uc_mcontext.gregs[REG_PC];
2075 #    else
2076   // Historical BSDism here.
2077   struct sigcontext *scontext = (struct sigcontext *)context;
2078 #      if defined(__arch64__)
2079   uptr pc = scontext->sigc_regs.tpc;
2080 #      else
2081   uptr pc = scontext->si_regs.pc;
2082 #      endif
2083 #    endif
2084   u32 instr = *(u32 *)pc;
2085   return (instr >> 21) & 1 ? Write : Read;
2086 #  elif defined(__riscv)
2087 #    if SANITIZER_FREEBSD
2088   unsigned long pc = ucontext->uc_mcontext.mc_gpregs.gp_sepc;
2089 #    else
2090   unsigned long pc = ucontext->uc_mcontext.__gregs[REG_PC];
2091 #    endif
2092   unsigned faulty_instruction = *(uint16_t *)pc;
2093 
2094 #    if defined(__riscv_compressed)
2095   if ((faulty_instruction & 0x3) != 0x3) {  // it's a compressed instruction
2096     // set op_bits to the instruction bits [1, 0, 15, 14, 13]
2097     unsigned op_bits =
2098         ((faulty_instruction & 0x3) << 3) | (faulty_instruction >> 13);
2099     unsigned rd = faulty_instruction & 0xF80;  // bits 7-11, inclusive
2100     switch (op_bits) {
2101       case 0b10'010:  // c.lwsp (rd != x0)
2102 #      if __riscv_xlen == 64
2103       case 0b10'011:  // c.ldsp (rd != x0)
2104 #      endif
2105         return rd ? SignalContext::Read : SignalContext::Unknown;
2106       case 0b00'010:  // c.lw
2107 #      if __riscv_flen >= 32 && __riscv_xlen == 32
2108       case 0b10'011:  // c.flwsp
2109 #      endif
2110 #      if __riscv_flen >= 32 || __riscv_xlen == 64
2111       case 0b00'011:  // c.flw / c.ld
2112 #      endif
2113 #      if __riscv_flen == 64
2114       case 0b00'001:  // c.fld
2115       case 0b10'001:  // c.fldsp
2116 #      endif
2117         return SignalContext::Read;
2118       case 0b00'110:  // c.sw
2119       case 0b10'110:  // c.swsp
2120 #      if __riscv_flen >= 32 || __riscv_xlen == 64
2121       case 0b00'111:  // c.fsw / c.sd
2122       case 0b10'111:  // c.fswsp / c.sdsp
2123 #      endif
2124 #      if __riscv_flen == 64
2125       case 0b00'101:  // c.fsd
2126       case 0b10'101:  // c.fsdsp
2127 #      endif
2128         return SignalContext::Write;
2129       default:
2130         return SignalContext::Unknown;
2131     }
2132   }
2133 #    endif
2134 
2135   unsigned opcode = faulty_instruction & 0x7f;         // lower 7 bits
2136   unsigned funct3 = (faulty_instruction >> 12) & 0x7;  // bits 12-14, inclusive
2137   switch (opcode) {
2138     case 0b0000011:  // loads
2139       switch (funct3) {
2140         case 0b000:  // lb
2141         case 0b001:  // lh
2142         case 0b010:  // lw
2143 #    if __riscv_xlen == 64
2144         case 0b011:  // ld
2145 #    endif
2146         case 0b100:  // lbu
2147         case 0b101:  // lhu
2148           return SignalContext::Read;
2149         default:
2150           return SignalContext::Unknown;
2151       }
2152     case 0b0100011:  // stores
2153       switch (funct3) {
2154         case 0b000:  // sb
2155         case 0b001:  // sh
2156         case 0b010:  // sw
2157 #    if __riscv_xlen == 64
2158         case 0b011:  // sd
2159 #    endif
2160           return SignalContext::Write;
2161         default:
2162           return SignalContext::Unknown;
2163       }
2164 #    if __riscv_flen >= 32
2165     case 0b0000111:  // floating-point loads
2166       switch (funct3) {
2167         case 0b010:  // flw
2168 #      if __riscv_flen == 64
2169         case 0b011:  // fld
2170 #      endif
2171           return SignalContext::Read;
2172         default:
2173           return SignalContext::Unknown;
2174       }
2175     case 0b0100111:  // floating-point stores
2176       switch (funct3) {
2177         case 0b010:  // fsw
2178 #      if __riscv_flen == 64
2179         case 0b011:  // fsd
2180 #      endif
2181           return SignalContext::Write;
2182         default:
2183           return SignalContext::Unknown;
2184       }
2185 #    endif
2186     default:
2187       return SignalContext::Unknown;
2188   }
2189 #  else
2190   (void)ucontext;
2191   return Unknown;  // FIXME: Implement.
2192 #  endif
2193 }
2194 
2195 bool SignalContext::IsTrueFaultingAddress() const {
2196   auto si = static_cast<const siginfo_t *>(siginfo);
2197   // SIGSEGV signals without a true fault address have si_code set to 128.
2198   return si->si_signo == SIGSEGV && si->si_code != 128;
2199 }
2200 
2201 UNUSED
2202 static const char *RegNumToRegName(int reg) {
2203   switch (reg) {
2204 #  if SANITIZER_LINUX && SANITIZER_GLIBC || SANITIZER_NETBSD
2205 #    if defined(__x86_64__)
2206 #      if SANITIZER_NETBSD
2207 #        define REG_RAX _REG_RAX
2208 #        define REG_RBX _REG_RBX
2209 #        define REG_RCX _REG_RCX
2210 #        define REG_RDX _REG_RDX
2211 #        define REG_RDI _REG_RDI
2212 #        define REG_RSI _REG_RSI
2213 #        define REG_RBP _REG_RBP
2214 #        define REG_RSP _REG_RSP
2215 #        define REG_R8 _REG_R8
2216 #        define REG_R9 _REG_R9
2217 #        define REG_R10 _REG_R10
2218 #        define REG_R11 _REG_R11
2219 #        define REG_R12 _REG_R12
2220 #        define REG_R13 _REG_R13
2221 #        define REG_R14 _REG_R14
2222 #        define REG_R15 _REG_R15
2223 #      endif
2224     case REG_RAX:
2225       return "rax";
2226     case REG_RBX:
2227       return "rbx";
2228     case REG_RCX:
2229       return "rcx";
2230     case REG_RDX:
2231       return "rdx";
2232     case REG_RDI:
2233       return "rdi";
2234     case REG_RSI:
2235       return "rsi";
2236     case REG_RBP:
2237       return "rbp";
2238     case REG_RSP:
2239       return "rsp";
2240     case REG_R8:
2241       return "r8";
2242     case REG_R9:
2243       return "r9";
2244     case REG_R10:
2245       return "r10";
2246     case REG_R11:
2247       return "r11";
2248     case REG_R12:
2249       return "r12";
2250     case REG_R13:
2251       return "r13";
2252     case REG_R14:
2253       return "r14";
2254     case REG_R15:
2255       return "r15";
2256 #    elif defined(__i386__)
2257 #      if SANITIZER_NETBSD
2258 #        define REG_EAX _REG_EAX
2259 #        define REG_EBX _REG_EBX
2260 #        define REG_ECX _REG_ECX
2261 #        define REG_EDX _REG_EDX
2262 #        define REG_EDI _REG_EDI
2263 #        define REG_ESI _REG_ESI
2264 #        define REG_EBP _REG_EBP
2265 #        define REG_ESP _REG_ESP
2266 #      endif
2267     case REG_EAX:
2268       return "eax";
2269     case REG_EBX:
2270       return "ebx";
2271     case REG_ECX:
2272       return "ecx";
2273     case REG_EDX:
2274       return "edx";
2275     case REG_EDI:
2276       return "edi";
2277     case REG_ESI:
2278       return "esi";
2279     case REG_EBP:
2280       return "ebp";
2281     case REG_ESP:
2282       return "esp";
2283 #    elif defined(__arm__)
2284 #      ifdef MAKE_CASE
2285 #        undef MAKE_CASE
2286 #      endif
2287 #      define REG_STR(reg) #reg
2288 #      define MAKE_CASE(N) \
2289         case REG_R##N:     \
2290           return REG_STR(r##N)
2291     MAKE_CASE(0);
2292     MAKE_CASE(1);
2293     MAKE_CASE(2);
2294     MAKE_CASE(3);
2295     MAKE_CASE(4);
2296     MAKE_CASE(5);
2297     MAKE_CASE(6);
2298     MAKE_CASE(7);
2299     MAKE_CASE(8);
2300     MAKE_CASE(9);
2301     MAKE_CASE(10);
2302     MAKE_CASE(11);
2303     MAKE_CASE(12);
2304     case REG_R13:
2305       return "sp";
2306     case REG_R14:
2307       return "lr";
2308     case REG_R15:
2309       return "pc";
2310 #    elif defined(__aarch64__)
2311 #      define REG_STR(reg) #reg
2312 #      define MAKE_CASE(N) \
2313         case N:            \
2314           return REG_STR(x##N)
2315     MAKE_CASE(0);
2316     MAKE_CASE(1);
2317     MAKE_CASE(2);
2318     MAKE_CASE(3);
2319     MAKE_CASE(4);
2320     MAKE_CASE(5);
2321     MAKE_CASE(6);
2322     MAKE_CASE(7);
2323     MAKE_CASE(8);
2324     MAKE_CASE(9);
2325     MAKE_CASE(10);
2326     MAKE_CASE(11);
2327     MAKE_CASE(12);
2328     MAKE_CASE(13);
2329     MAKE_CASE(14);
2330     MAKE_CASE(15);
2331     MAKE_CASE(16);
2332     MAKE_CASE(17);
2333     MAKE_CASE(18);
2334     MAKE_CASE(19);
2335     MAKE_CASE(20);
2336     MAKE_CASE(21);
2337     MAKE_CASE(22);
2338     MAKE_CASE(23);
2339     MAKE_CASE(24);
2340     MAKE_CASE(25);
2341     MAKE_CASE(26);
2342     MAKE_CASE(27);
2343     MAKE_CASE(28);
2344     case 29:
2345       return "fp";
2346     case 30:
2347       return "lr";
2348     case 31:
2349       return "sp";
2350 #    endif
2351 #  endif  // SANITIZER_LINUX && SANITIZER_GLIBC
2352     default:
2353       return NULL;
2354   }
2355   return NULL;
2356 }
2357 
2358 #  if ((SANITIZER_LINUX && SANITIZER_GLIBC) || SANITIZER_NETBSD) && \
2359       (defined(__arm__) || defined(__aarch64__))
2360 static uptr GetArmRegister(ucontext_t *ctx, int RegNum) {
2361   switch (RegNum) {
2362 #    if defined(__arm__) && !SANITIZER_NETBSD
2363 #      ifdef MAKE_CASE
2364 #        undef MAKE_CASE
2365 #      endif
2366 #      define MAKE_CASE(N) \
2367         case REG_R##N:     \
2368           return ctx->uc_mcontext.arm_r##N
2369     MAKE_CASE(0);
2370     MAKE_CASE(1);
2371     MAKE_CASE(2);
2372     MAKE_CASE(3);
2373     MAKE_CASE(4);
2374     MAKE_CASE(5);
2375     MAKE_CASE(6);
2376     MAKE_CASE(7);
2377     MAKE_CASE(8);
2378     MAKE_CASE(9);
2379     MAKE_CASE(10);
2380     case REG_R11:
2381       return ctx->uc_mcontext.arm_fp;
2382     case REG_R12:
2383       return ctx->uc_mcontext.arm_ip;
2384     case REG_R13:
2385       return ctx->uc_mcontext.arm_sp;
2386     case REG_R14:
2387       return ctx->uc_mcontext.arm_lr;
2388     case REG_R15:
2389       return ctx->uc_mcontext.arm_pc;
2390 #    elif defined(__aarch64__)
2391 #      if SANITIZER_LINUX
2392     case 0 ... 30:
2393       return ctx->uc_mcontext.regs[RegNum];
2394     case 31:
2395       return ctx->uc_mcontext.sp;
2396 #      elif SANITIZER_NETBSD
2397     case 0 ... 31:
2398       return ctx->uc_mcontext.__gregs[RegNum];
2399 #      endif
2400 #    endif
2401     default:
2402       return 0;
2403   }
2404   return 0;
2405 }
2406 #  endif  // SANITIZER_LINUX && SANITIZER_GLIBC && (defined(__arm__) ||
2407           // defined(__aarch64__))
2408 
2409 UNUSED
2410 static void DumpSingleReg(ucontext_t *ctx, int RegNum) {
2411   const char *RegName = RegNumToRegName(RegNum);
2412 #  if SANITIZER_LINUX && SANITIZER_GLIBC || SANITIZER_NETBSD
2413 #    if defined(__x86_64__)
2414   Printf("%s%s = 0x%016llx  ", internal_strlen(RegName) == 2 ? " " : "",
2415          RegName,
2416 #      if SANITIZER_LINUX
2417          ctx->uc_mcontext.gregs[RegNum]
2418 #      elif SANITIZER_NETBSD
2419          ctx->uc_mcontext.__gregs[RegNum]
2420 #      endif
2421   );
2422 #    elif defined(__i386__)
2423   Printf("%s = 0x%08x  ", RegName,
2424 #      if SANITIZER_LINUX
2425          ctx->uc_mcontext.gregs[RegNum]
2426 #      elif SANITIZER_NETBSD
2427          ctx->uc_mcontext.__gregs[RegNum]
2428 #      endif
2429   );
2430 #    elif defined(__arm__)
2431   Printf("%s%s = 0x%08zx  ", internal_strlen(RegName) == 2 ? " " : "", RegName,
2432          GetArmRegister(ctx, RegNum));
2433 #    elif defined(__aarch64__)
2434   Printf("%s%s = 0x%016zx  ", internal_strlen(RegName) == 2 ? " " : "", RegName,
2435          GetArmRegister(ctx, RegNum));
2436 #    else
2437   (void)RegName;
2438 #    endif
2439 #  else
2440   (void)RegName;
2441 #  endif
2442 }
2443 
2444 void SignalContext::DumpAllRegisters(void *context) {
2445   ucontext_t *ucontext = (ucontext_t *)context;
2446 #  if SANITIZER_LINUX && SANITIZER_GLIBC || SANITIZER_NETBSD
2447 #    if defined(__x86_64__)
2448   Report("Register values:\n");
2449   DumpSingleReg(ucontext, REG_RAX);
2450   DumpSingleReg(ucontext, REG_RBX);
2451   DumpSingleReg(ucontext, REG_RCX);
2452   DumpSingleReg(ucontext, REG_RDX);
2453   Printf("\n");
2454   DumpSingleReg(ucontext, REG_RDI);
2455   DumpSingleReg(ucontext, REG_RSI);
2456   DumpSingleReg(ucontext, REG_RBP);
2457   DumpSingleReg(ucontext, REG_RSP);
2458   Printf("\n");
2459   DumpSingleReg(ucontext, REG_R8);
2460   DumpSingleReg(ucontext, REG_R9);
2461   DumpSingleReg(ucontext, REG_R10);
2462   DumpSingleReg(ucontext, REG_R11);
2463   Printf("\n");
2464   DumpSingleReg(ucontext, REG_R12);
2465   DumpSingleReg(ucontext, REG_R13);
2466   DumpSingleReg(ucontext, REG_R14);
2467   DumpSingleReg(ucontext, REG_R15);
2468   Printf("\n");
2469 #    elif defined(__i386__)
2470   // Duplication of this report print is caused by partial support
2471   // of register values dumping. In case of unsupported yet architecture let's
2472   // avoid printing 'Register values:' without actual values in the following
2473   // output.
2474   Report("Register values:\n");
2475   DumpSingleReg(ucontext, REG_EAX);
2476   DumpSingleReg(ucontext, REG_EBX);
2477   DumpSingleReg(ucontext, REG_ECX);
2478   DumpSingleReg(ucontext, REG_EDX);
2479   Printf("\n");
2480   DumpSingleReg(ucontext, REG_EDI);
2481   DumpSingleReg(ucontext, REG_ESI);
2482   DumpSingleReg(ucontext, REG_EBP);
2483   DumpSingleReg(ucontext, REG_ESP);
2484   Printf("\n");
2485 #    elif defined(__arm__) && !SANITIZER_NETBSD
2486   Report("Register values:\n");
2487   DumpSingleReg(ucontext, REG_R0);
2488   DumpSingleReg(ucontext, REG_R1);
2489   DumpSingleReg(ucontext, REG_R2);
2490   DumpSingleReg(ucontext, REG_R3);
2491   Printf("\n");
2492   DumpSingleReg(ucontext, REG_R4);
2493   DumpSingleReg(ucontext, REG_R5);
2494   DumpSingleReg(ucontext, REG_R6);
2495   DumpSingleReg(ucontext, REG_R7);
2496   Printf("\n");
2497   DumpSingleReg(ucontext, REG_R8);
2498   DumpSingleReg(ucontext, REG_R9);
2499   DumpSingleReg(ucontext, REG_R10);
2500   DumpSingleReg(ucontext, REG_R11);
2501   Printf("\n");
2502   DumpSingleReg(ucontext, REG_R12);
2503   DumpSingleReg(ucontext, REG_R13);
2504   DumpSingleReg(ucontext, REG_R14);
2505   DumpSingleReg(ucontext, REG_R15);
2506   Printf("\n");
2507 #    elif defined(__aarch64__)
2508   Report("Register values:\n");
2509   for (int i = 0; i <= 31; ++i) {
2510     DumpSingleReg(ucontext, i);
2511     if (i % 4 == 3)
2512       Printf("\n");
2513   }
2514 #    else
2515   (void)ucontext;
2516 #    endif
2517 #  elif SANITIZER_FREEBSD
2518 #    if defined(__x86_64__)
2519   Report("Register values:\n");
2520   Printf("rax = 0x%016lx  ", ucontext->uc_mcontext.mc_rax);
2521   Printf("rbx = 0x%016lx  ", ucontext->uc_mcontext.mc_rbx);
2522   Printf("rcx = 0x%016lx  ", ucontext->uc_mcontext.mc_rcx);
2523   Printf("rdx = 0x%016lx  ", ucontext->uc_mcontext.mc_rdx);
2524   Printf("\n");
2525   Printf("rdi = 0x%016lx  ", ucontext->uc_mcontext.mc_rdi);
2526   Printf("rsi = 0x%016lx  ", ucontext->uc_mcontext.mc_rsi);
2527   Printf("rbp = 0x%016lx  ", ucontext->uc_mcontext.mc_rbp);
2528   Printf("rsp = 0x%016lx  ", ucontext->uc_mcontext.mc_rsp);
2529   Printf("\n");
2530   Printf(" r8 = 0x%016lx  ", ucontext->uc_mcontext.mc_r8);
2531   Printf(" r9 = 0x%016lx  ", ucontext->uc_mcontext.mc_r9);
2532   Printf("r10 = 0x%016lx  ", ucontext->uc_mcontext.mc_r10);
2533   Printf("r11 = 0x%016lx  ", ucontext->uc_mcontext.mc_r11);
2534   Printf("\n");
2535   Printf("r12 = 0x%016lx  ", ucontext->uc_mcontext.mc_r12);
2536   Printf("r13 = 0x%016lx  ", ucontext->uc_mcontext.mc_r13);
2537   Printf("r14 = 0x%016lx  ", ucontext->uc_mcontext.mc_r14);
2538   Printf("r15 = 0x%016lx  ", ucontext->uc_mcontext.mc_r15);
2539   Printf("\n");
2540 #    elif defined(__i386__)
2541   Report("Register values:\n");
2542   Printf("eax = 0x%08x  ", ucontext->uc_mcontext.mc_eax);
2543   Printf("ebx = 0x%08x  ", ucontext->uc_mcontext.mc_ebx);
2544   Printf("ecx = 0x%08x  ", ucontext->uc_mcontext.mc_ecx);
2545   Printf("edx = 0x%08x  ", ucontext->uc_mcontext.mc_edx);
2546   Printf("\n");
2547   Printf("edi = 0x%08x  ", ucontext->uc_mcontext.mc_edi);
2548   Printf("esi = 0x%08x  ", ucontext->uc_mcontext.mc_esi);
2549   Printf("ebp = 0x%08x  ", ucontext->uc_mcontext.mc_ebp);
2550   Printf("esp = 0x%08x  ", ucontext->uc_mcontext.mc_esp);
2551   Printf("\n");
2552 #    else
2553   (void)ucontext;
2554 #    endif
2555 #  else
2556   (void)ucontext;
2557 #  endif
2558   // FIXME: Implement this for other OSes and architectures.
2559 }
2560 
2561 static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
2562 #  if SANITIZER_NETBSD
2563   // This covers all NetBSD architectures
2564   ucontext_t *ucontext = (ucontext_t *)context;
2565   *pc = _UC_MACHINE_PC(ucontext);
2566   *bp = _UC_MACHINE_FP(ucontext);
2567   *sp = _UC_MACHINE_SP(ucontext);
2568 #  elif defined(__arm__)
2569   ucontext_t *ucontext = (ucontext_t *)context;
2570   *pc = ucontext->uc_mcontext.arm_pc;
2571   *bp = ucontext->uc_mcontext.arm_fp;
2572   *sp = ucontext->uc_mcontext.arm_sp;
2573 #  elif defined(__aarch64__)
2574 #    if SANITIZER_FREEBSD
2575   ucontext_t *ucontext = (ucontext_t *)context;
2576   *pc = ucontext->uc_mcontext.mc_gpregs.gp_elr;
2577   *bp = ucontext->uc_mcontext.mc_gpregs.gp_x[29];
2578   *sp = ucontext->uc_mcontext.mc_gpregs.gp_sp;
2579 #    else
2580   ucontext_t *ucontext = (ucontext_t *)context;
2581   *pc = ucontext->uc_mcontext.pc;
2582   *bp = ucontext->uc_mcontext.regs[29];
2583   *sp = ucontext->uc_mcontext.sp;
2584 #    endif
2585 #  elif defined(__hppa__)
2586   ucontext_t *ucontext = (ucontext_t *)context;
2587   *pc = ucontext->uc_mcontext.sc_iaoq[0];
2588   /* GCC uses %r3 whenever a frame pointer is needed.  */
2589   *bp = ucontext->uc_mcontext.sc_gr[3];
2590   *sp = ucontext->uc_mcontext.sc_gr[30];
2591 #  elif defined(__x86_64__)
2592 #    if SANITIZER_FREEBSD
2593   ucontext_t *ucontext = (ucontext_t *)context;
2594   *pc = ucontext->uc_mcontext.mc_rip;
2595   *bp = ucontext->uc_mcontext.mc_rbp;
2596   *sp = ucontext->uc_mcontext.mc_rsp;
2597 #    else
2598   ucontext_t *ucontext = (ucontext_t *)context;
2599   *pc = ucontext->uc_mcontext.gregs[REG_RIP];
2600   *bp = ucontext->uc_mcontext.gregs[REG_RBP];
2601   *sp = ucontext->uc_mcontext.gregs[REG_RSP];
2602 #    endif
2603 #  elif defined(__i386__)
2604 #    if SANITIZER_FREEBSD
2605   ucontext_t *ucontext = (ucontext_t *)context;
2606   *pc = ucontext->uc_mcontext.mc_eip;
2607   *bp = ucontext->uc_mcontext.mc_ebp;
2608   *sp = ucontext->uc_mcontext.mc_esp;
2609 #    else
2610   ucontext_t *ucontext = (ucontext_t *)context;
2611 #      if SANITIZER_SOLARIS
2612   /* Use the numeric values: the symbolic ones are undefined by llvm
2613      include/llvm/Support/Solaris.h.  */
2614 #        ifndef REG_EIP
2615 #          define REG_EIP 14  // REG_PC
2616 #        endif
2617 #        ifndef REG_EBP
2618 #          define REG_EBP 6  // REG_FP
2619 #        endif
2620 #        ifndef REG_UESP
2621 #          define REG_UESP 17  // REG_SP
2622 #        endif
2623 #      endif
2624   *pc = ucontext->uc_mcontext.gregs[REG_EIP];
2625   *bp = ucontext->uc_mcontext.gregs[REG_EBP];
2626   *sp = ucontext->uc_mcontext.gregs[REG_UESP];
2627 #    endif
2628 #  elif defined(__powerpc__) || defined(__powerpc64__)
2629 #    if SANITIZER_FREEBSD
2630   ucontext_t *ucontext = (ucontext_t *)context;
2631   *pc = ucontext->uc_mcontext.mc_srr0;
2632   *sp = ucontext->uc_mcontext.mc_frame[1];
2633   *bp = ucontext->uc_mcontext.mc_frame[31];
2634 #    else
2635   ucontext_t *ucontext = (ucontext_t *)context;
2636   *pc = ucontext->uc_mcontext.regs->nip;
2637   *sp = ucontext->uc_mcontext.regs->gpr[PT_R1];
2638   // The powerpc{,64}-linux ABIs do not specify r31 as the frame
2639   // pointer, but GCC always uses r31 when we need a frame pointer.
2640   *bp = ucontext->uc_mcontext.regs->gpr[PT_R31];
2641 #    endif
2642 #  elif defined(__sparc__)
2643 #    if defined(__arch64__) || defined(__sparcv9)
2644 #      define STACK_BIAS 2047
2645 #    else
2646 #      define STACK_BIAS 0
2647 #    endif
2648 #    if SANITIZER_SOLARIS
2649   ucontext_t *ucontext = (ucontext_t *)context;
2650   *pc = ucontext->uc_mcontext.gregs[REG_PC];
2651   *sp = ucontext->uc_mcontext.gregs[REG_SP] + STACK_BIAS;
2652   // Avoid SEGV when dereferencing sp on stack overflow with non-faulting load.
2653   // This requires a SPARC V9 CPU.  Cannot use #ASI_PNF here: only supported
2654   // since clang-19.
2655 #      if defined(__sparcv9)
2656   asm("ldxa [%[fp]] 0x82, %[bp]"
2657 #      else
2658   asm("lduwa [%[fp]] 0x82, %[bp]"
2659 #      endif
2660       : [bp] "=r"(*bp)
2661       : [fp] "r"(&((struct frame *)*sp)->fr_savfp));
2662   if (*bp)
2663     *bp += STACK_BIAS;
2664 #    else
2665   // Historical BSDism here.
2666   struct sigcontext *scontext = (struct sigcontext *)context;
2667 #      if defined(__arch64__)
2668   *pc = scontext->sigc_regs.tpc;
2669   *sp = scontext->sigc_regs.u_regs[14] + STACK_BIAS;
2670 #      else
2671   *pc = scontext->si_regs.pc;
2672   *sp = scontext->si_regs.u_regs[14];
2673 #      endif
2674   *bp = (uptr)((uhwptr *)*sp)[14] + STACK_BIAS;
2675 #    endif
2676 #  elif defined(__mips__)
2677   ucontext_t *ucontext = (ucontext_t *)context;
2678   *pc = ucontext->uc_mcontext.pc;
2679   *bp = ucontext->uc_mcontext.gregs[30];
2680   *sp = ucontext->uc_mcontext.gregs[29];
2681 #  elif defined(__s390__)
2682   ucontext_t *ucontext = (ucontext_t *)context;
2683 #    if defined(__s390x__)
2684   *pc = ucontext->uc_mcontext.psw.addr;
2685 #    else
2686   *pc = ucontext->uc_mcontext.psw.addr & 0x7fffffff;
2687 #    endif
2688   *bp = ucontext->uc_mcontext.gregs[11];
2689   *sp = ucontext->uc_mcontext.gregs[15];
2690 #  elif defined(__riscv)
2691   ucontext_t *ucontext = (ucontext_t *)context;
2692 #    if SANITIZER_FREEBSD
2693   *pc = ucontext->uc_mcontext.mc_gpregs.gp_sepc;
2694   *bp = ucontext->uc_mcontext.mc_gpregs.gp_s[0];
2695   *sp = ucontext->uc_mcontext.mc_gpregs.gp_sp;
2696 #    else
2697   *pc = ucontext->uc_mcontext.__gregs[REG_PC];
2698   *bp = ucontext->uc_mcontext.__gregs[REG_S0];
2699   *sp = ucontext->uc_mcontext.__gregs[REG_SP];
2700 #    endif
2701 #  elif defined(__hexagon__)
2702   ucontext_t *ucontext = (ucontext_t *)context;
2703   *pc = ucontext->uc_mcontext.pc;
2704   *bp = ucontext->uc_mcontext.r30;
2705   *sp = ucontext->uc_mcontext.r29;
2706 #  elif defined(__loongarch__)
2707   ucontext_t *ucontext = (ucontext_t *)context;
2708   *pc = ucontext->uc_mcontext.__pc;
2709   *bp = ucontext->uc_mcontext.__gregs[22];
2710   *sp = ucontext->uc_mcontext.__gregs[3];
2711 #  else
2712 #    error "Unsupported arch"
2713 #  endif
2714 }
2715 
2716 void SignalContext::InitPcSpBp() { GetPcSpBp(context, &pc, &sp, &bp); }
2717 
2718 void InitializePlatformEarly() { InitTlsSize(); }
2719 
2720 void CheckASLR() {
2721 #  if SANITIZER_NETBSD
2722   int mib[3];
2723   int paxflags;
2724   uptr len = sizeof(paxflags);
2725 
2726   mib[0] = CTL_PROC;
2727   mib[1] = internal_getpid();
2728   mib[2] = PROC_PID_PAXFLAGS;
2729 
2730   if (UNLIKELY(internal_sysctl(mib, 3, &paxflags, &len, NULL, 0) == -1)) {
2731     Printf("sysctl failed\n");
2732     Die();
2733   }
2734 
2735   if (UNLIKELY(paxflags & CTL_PROC_PAXFLAGS_ASLR)) {
2736     Printf(
2737         "This sanitizer is not compatible with enabled ASLR.\n"
2738         "To disable ASLR, please run \"paxctl +a %s\" and try again.\n",
2739         GetArgv()[0]);
2740     Die();
2741   }
2742 #  elif SANITIZER_FREEBSD
2743   int aslr_status;
2744   int r = internal_procctl(P_PID, 0, PROC_ASLR_STATUS, &aslr_status);
2745   if (UNLIKELY(r == -1)) {
2746     // We're making things less 'dramatic' here since
2747     // the cmd is not necessarily guaranteed to be here
2748     // just yet regarding FreeBSD release
2749     return;
2750   }
2751   if ((aslr_status & PROC_ASLR_ACTIVE) != 0) {
2752     VReport(1,
2753             "This sanitizer is not compatible with enabled ASLR "
2754             "and binaries compiled with PIE\n"
2755             "ASLR will be disabled and the program re-executed.\n");
2756     int aslr_ctl = PROC_ASLR_FORCE_DISABLE;
2757     CHECK_NE(internal_procctl(P_PID, 0, PROC_ASLR_CTL, &aslr_ctl), -1);
2758     ReExec();
2759   }
2760 #  elif SANITIZER_PPC64V2
2761   // Disable ASLR for Linux PPC64LE.
2762   int old_personality = personality(0xffffffff);
2763   if (old_personality != -1 && (old_personality & ADDR_NO_RANDOMIZE) == 0) {
2764     VReport(1,
2765             "WARNING: Program is being run with address space layout "
2766             "randomization (ASLR) enabled which prevents the thread and "
2767             "memory sanitizers from working on powerpc64le.\n"
2768             "ASLR will be disabled and the program re-executed.\n");
2769     CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1);
2770     ReExec();
2771   }
2772 #  else
2773   // Do nothing
2774 #  endif
2775 }
2776 
2777 void CheckMPROTECT() {
2778 #  if SANITIZER_NETBSD
2779   int mib[3];
2780   int paxflags;
2781   uptr len = sizeof(paxflags);
2782 
2783   mib[0] = CTL_PROC;
2784   mib[1] = internal_getpid();
2785   mib[2] = PROC_PID_PAXFLAGS;
2786 
2787   if (UNLIKELY(internal_sysctl(mib, 3, &paxflags, &len, NULL, 0) == -1)) {
2788     Printf("sysctl failed\n");
2789     Die();
2790   }
2791 
2792   if (UNLIKELY(paxflags & CTL_PROC_PAXFLAGS_MPROTECT)) {
2793     Printf("This sanitizer is not compatible with enabled MPROTECT\n");
2794     Die();
2795   }
2796 #  else
2797   // Do nothing
2798 #  endif
2799 }
2800 
2801 void CheckNoDeepBind(const char *filename, int flag) {
2802 #  ifdef RTLD_DEEPBIND
2803   if (flag & RTLD_DEEPBIND) {
2804     Report(
2805         "You are trying to dlopen a %s shared library with RTLD_DEEPBIND flag"
2806         " which is incompatible with sanitizer runtime "
2807         "(see https://github.com/google/sanitizers/issues/611 for details"
2808         "). If you want to run %s library under sanitizers please remove "
2809         "RTLD_DEEPBIND from dlopen flags.\n",
2810         filename, filename);
2811     Die();
2812   }
2813 #  endif
2814 }
2815 
2816 uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,
2817                               uptr *largest_gap_found,
2818                               uptr *max_occupied_addr) {
2819   UNREACHABLE("FindAvailableMemoryRange is not available");
2820   return 0;
2821 }
2822 
2823 bool GetRandom(void *buffer, uptr length, bool blocking) {
2824   if (!buffer || !length || length > 256)
2825     return false;
2826 #  if SANITIZER_USE_GETENTROPY
2827   uptr rnd = getentropy(buffer, length);
2828   int rverrno = 0;
2829   if (internal_iserror(rnd, &rverrno) && rverrno == EFAULT)
2830     return false;
2831   else if (rnd == 0)
2832     return true;
2833 #  endif  // SANITIZER_USE_GETENTROPY
2834 
2835 #  if SANITIZER_USE_GETRANDOM
2836   static atomic_uint8_t skip_getrandom_syscall;
2837   if (!atomic_load_relaxed(&skip_getrandom_syscall)) {
2838     // Up to 256 bytes, getrandom will not be interrupted.
2839     uptr res = internal_syscall(SYSCALL(getrandom), buffer, length,
2840                                 blocking ? 0 : GRND_NONBLOCK);
2841     int rverrno = 0;
2842     if (internal_iserror(res, &rverrno) && rverrno == ENOSYS)
2843       atomic_store_relaxed(&skip_getrandom_syscall, 1);
2844     else if (res == length)
2845       return true;
2846   }
2847 #  endif  // SANITIZER_USE_GETRANDOM
2848   // Up to 256 bytes, a read off /dev/urandom will not be interrupted.
2849   // blocking is moot here, O_NONBLOCK has no effect when opening /dev/urandom.
2850   uptr fd = internal_open("/dev/urandom", O_RDONLY);
2851   if (internal_iserror(fd))
2852     return false;
2853   uptr res = internal_read(fd, buffer, length);
2854   if (internal_iserror(res))
2855     return false;
2856   internal_close(fd);
2857   return true;
2858 }
2859 
2860 }  // namespace __sanitizer
2861 
2862 #endif
2863