sanitizer_linux.cpp 76 KB

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