sanitizer_linux_libcdep.cpp 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. //===-- sanitizer_linux_libcdep.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_allocator_internal.h"
  17. #include "sanitizer_atomic.h"
  18. #include "sanitizer_common.h"
  19. #include "sanitizer_file.h"
  20. #include "sanitizer_flags.h"
  21. #include "sanitizer_freebsd.h"
  22. #include "sanitizer_getauxval.h"
  23. #include "sanitizer_glibc_version.h"
  24. #include "sanitizer_linux.h"
  25. #include "sanitizer_placement_new.h"
  26. #include "sanitizer_procmaps.h"
  27. #if SANITIZER_NETBSD
  28. #define _RTLD_SOURCE // for __lwp_gettcb_fast() / __lwp_getprivate_fast()
  29. #endif
  30. #include <dlfcn.h> // for dlsym()
  31. #include <link.h>
  32. #include <pthread.h>
  33. #include <signal.h>
  34. #include <sys/mman.h>
  35. #include <sys/resource.h>
  36. #include <syslog.h>
  37. #if !defined(ElfW)
  38. #define ElfW(type) Elf_##type
  39. #endif
  40. #if SANITIZER_FREEBSD
  41. #include <pthread_np.h>
  42. #include <osreldate.h>
  43. #include <sys/sysctl.h>
  44. #define pthread_getattr_np pthread_attr_get_np
  45. // The MAP_NORESERVE define has been removed in FreeBSD 11.x, and even before
  46. // that, it was never implemented. So just define it to zero.
  47. #undef MAP_NORESERVE
  48. #define MAP_NORESERVE 0
  49. #endif
  50. #if SANITIZER_NETBSD
  51. #include <sys/sysctl.h>
  52. #error #include <sys/tls.h>
  53. #include <lwp.h>
  54. #endif
  55. #if SANITIZER_SOLARIS
  56. #include <stdlib.h>
  57. #include <thread.h>
  58. #endif
  59. #if SANITIZER_ANDROID
  60. #include <android/api-level.h>
  61. #if !defined(CPU_COUNT) && !defined(__aarch64__)
  62. #include <dirent.h>
  63. #include <fcntl.h>
  64. struct __sanitizer::linux_dirent {
  65. long d_ino;
  66. off_t d_off;
  67. unsigned short d_reclen;
  68. char d_name[];
  69. };
  70. #endif
  71. #endif
  72. #if !SANITIZER_ANDROID
  73. #include <elf.h>
  74. #include <unistd.h>
  75. #endif
  76. namespace __sanitizer {
  77. SANITIZER_WEAK_ATTRIBUTE int
  78. real_sigaction(int signum, const void *act, void *oldact);
  79. int internal_sigaction(int signum, const void *act, void *oldact) {
  80. #if !SANITIZER_GO
  81. if (&real_sigaction)
  82. return real_sigaction(signum, act, oldact);
  83. #endif
  84. return sigaction(signum, (const struct sigaction *)act,
  85. (struct sigaction *)oldact);
  86. }
  87. void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,
  88. uptr *stack_bottom) {
  89. CHECK(stack_top);
  90. CHECK(stack_bottom);
  91. if (at_initialization) {
  92. // This is the main thread. Libpthread may not be initialized yet.
  93. struct rlimit rl;
  94. CHECK_EQ(getrlimit(RLIMIT_STACK, &rl), 0);
  95. // Find the mapping that contains a stack variable.
  96. MemoryMappingLayout proc_maps(/*cache_enabled*/true);
  97. if (proc_maps.Error()) {
  98. *stack_top = *stack_bottom = 0;
  99. return;
  100. }
  101. MemoryMappedSegment segment;
  102. uptr prev_end = 0;
  103. while (proc_maps.Next(&segment)) {
  104. if ((uptr)&rl < segment.end) break;
  105. prev_end = segment.end;
  106. }
  107. CHECK((uptr)&rl >= segment.start && (uptr)&rl < segment.end);
  108. // Get stacksize from rlimit, but clip it so that it does not overlap
  109. // with other mappings.
  110. uptr stacksize = rl.rlim_cur;
  111. if (stacksize > segment.end - prev_end) stacksize = segment.end - prev_end;
  112. // When running with unlimited stack size, we still want to set some limit.
  113. // The unlimited stack size is caused by 'ulimit -s unlimited'.
  114. // Also, for some reason, GNU make spawns subprocesses with unlimited stack.
  115. if (stacksize > kMaxThreadStackSize)
  116. stacksize = kMaxThreadStackSize;
  117. *stack_top = segment.end;
  118. *stack_bottom = segment.end - stacksize;
  119. return;
  120. }
  121. uptr stacksize = 0;
  122. void *stackaddr = nullptr;
  123. #if SANITIZER_SOLARIS
  124. stack_t ss;
  125. CHECK_EQ(thr_stksegment(&ss), 0);
  126. stacksize = ss.ss_size;
  127. stackaddr = (char *)ss.ss_sp - stacksize;
  128. #else // !SANITIZER_SOLARIS
  129. pthread_attr_t attr;
  130. pthread_attr_init(&attr);
  131. CHECK_EQ(pthread_getattr_np(pthread_self(), &attr), 0);
  132. my_pthread_attr_getstack(&attr, &stackaddr, &stacksize);
  133. pthread_attr_destroy(&attr);
  134. #endif // SANITIZER_SOLARIS
  135. *stack_top = (uptr)stackaddr + stacksize;
  136. *stack_bottom = (uptr)stackaddr;
  137. }
  138. #if !SANITIZER_GO
  139. bool SetEnv(const char *name, const char *value) {
  140. void *f = dlsym(RTLD_NEXT, "setenv");
  141. if (!f)
  142. return false;
  143. typedef int(*setenv_ft)(const char *name, const char *value, int overwrite);
  144. setenv_ft setenv_f;
  145. CHECK_EQ(sizeof(setenv_f), sizeof(f));
  146. internal_memcpy(&setenv_f, &f, sizeof(f));
  147. return setenv_f(name, value, 1) == 0;
  148. }
  149. #endif
  150. __attribute__((unused)) static bool GetLibcVersion(int *major, int *minor,
  151. int *patch) {
  152. #ifdef _CS_GNU_LIBC_VERSION
  153. char buf[64];
  154. uptr len = confstr(_CS_GNU_LIBC_VERSION, buf, sizeof(buf));
  155. if (len >= sizeof(buf))
  156. return false;
  157. buf[len] = 0;
  158. static const char kGLibC[] = "glibc ";
  159. if (internal_strncmp(buf, kGLibC, sizeof(kGLibC) - 1) != 0)
  160. return false;
  161. const char *p = buf + sizeof(kGLibC) - 1;
  162. *major = internal_simple_strtoll(p, &p, 10);
  163. *minor = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0;
  164. *patch = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0;
  165. return true;
  166. #else
  167. return false;
  168. #endif
  169. }
  170. // True if we can use dlpi_tls_data. glibc before 2.25 may leave NULL (BZ
  171. // #19826) so dlpi_tls_data cannot be used.
  172. //
  173. // musl before 1.2.3 and FreeBSD as of 12.2 incorrectly set dlpi_tls_data to
  174. // the TLS initialization image
  175. // https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254774
  176. __attribute__((unused)) static int g_use_dlpi_tls_data;
  177. #if SANITIZER_GLIBC && !SANITIZER_GO
  178. __attribute__((unused)) static size_t g_tls_size;
  179. void InitTlsSize() {
  180. int major, minor, patch;
  181. g_use_dlpi_tls_data =
  182. GetLibcVersion(&major, &minor, &patch) && major == 2 && minor >= 25;
  183. #if defined(__aarch64__) || defined(__x86_64__) || defined(__powerpc64__)
  184. void *get_tls_static_info = dlsym(RTLD_NEXT, "_dl_get_tls_static_info");
  185. size_t tls_align;
  186. ((void (*)(size_t *, size_t *))get_tls_static_info)(&g_tls_size, &tls_align);
  187. #endif
  188. }
  189. #else
  190. void InitTlsSize() { }
  191. #endif // SANITIZER_GLIBC && !SANITIZER_GO
  192. // On glibc x86_64, ThreadDescriptorSize() needs to be precise due to the usage
  193. // of g_tls_size. On other targets, ThreadDescriptorSize() is only used by lsan
  194. // to get the pointer to thread-specific data keys in the thread control block.
  195. #if (SANITIZER_FREEBSD || SANITIZER_LINUX) && !SANITIZER_ANDROID && !SANITIZER_GO
  196. // sizeof(struct pthread) from glibc.
  197. static atomic_uintptr_t thread_descriptor_size;
  198. static uptr ThreadDescriptorSizeFallback() {
  199. uptr val = 0;
  200. #if defined(__x86_64__) || defined(__i386__) || defined(__arm__)
  201. int major;
  202. int minor;
  203. int patch;
  204. if (GetLibcVersion(&major, &minor, &patch) && major == 2) {
  205. /* sizeof(struct pthread) values from various glibc versions. */
  206. if (SANITIZER_X32)
  207. val = 1728; // Assume only one particular version for x32.
  208. // For ARM sizeof(struct pthread) changed in Glibc 2.23.
  209. else if (SANITIZER_ARM)
  210. val = minor <= 22 ? 1120 : 1216;
  211. else if (minor <= 3)
  212. val = FIRST_32_SECOND_64(1104, 1696);
  213. else if (minor == 4)
  214. val = FIRST_32_SECOND_64(1120, 1728);
  215. else if (minor == 5)
  216. val = FIRST_32_SECOND_64(1136, 1728);
  217. else if (minor <= 9)
  218. val = FIRST_32_SECOND_64(1136, 1712);
  219. else if (minor == 10)
  220. val = FIRST_32_SECOND_64(1168, 1776);
  221. else if (minor == 11 || (minor == 12 && patch == 1))
  222. val = FIRST_32_SECOND_64(1168, 2288);
  223. else if (minor <= 14)
  224. val = FIRST_32_SECOND_64(1168, 2304);
  225. else if (minor < 32) // Unknown version
  226. val = FIRST_32_SECOND_64(1216, 2304);
  227. else // minor == 32
  228. val = FIRST_32_SECOND_64(1344, 2496);
  229. }
  230. #elif defined(__s390__) || defined(__sparc__)
  231. // The size of a prefix of TCB including pthread::{specific_1stblock,specific}
  232. // suffices. Just return offsetof(struct pthread, specific_used), which hasn't
  233. // changed since 2007-05. Technically this applies to i386/x86_64 as well but
  234. // we call _dl_get_tls_static_info and need the precise size of struct
  235. // pthread.
  236. return FIRST_32_SECOND_64(524, 1552);
  237. #elif defined(__mips__)
  238. // TODO(sagarthakur): add more values as per different glibc versions.
  239. val = FIRST_32_SECOND_64(1152, 1776);
  240. #elif SANITIZER_RISCV64
  241. int major;
  242. int minor;
  243. int patch;
  244. if (GetLibcVersion(&major, &minor, &patch) && major == 2) {
  245. // TODO: consider adding an optional runtime check for an unknown (untested)
  246. // glibc version
  247. if (minor <= 28) // WARNING: the highest tested version is 2.29
  248. val = 1772; // no guarantees for this one
  249. else if (minor <= 31)
  250. val = 1772; // tested against glibc 2.29, 2.31
  251. else
  252. val = 1936; // tested against glibc 2.32
  253. }
  254. #elif defined(__aarch64__)
  255. // The sizeof (struct pthread) is the same from GLIBC 2.17 to 2.22.
  256. val = 1776;
  257. #elif defined(__powerpc64__)
  258. val = 1776; // from glibc.ppc64le 2.20-8.fc21
  259. #endif
  260. return val;
  261. }
  262. uptr ThreadDescriptorSize() {
  263. uptr val = atomic_load_relaxed(&thread_descriptor_size);
  264. if (val)
  265. return val;
  266. // _thread_db_sizeof_pthread is a GLIBC_PRIVATE symbol that is exported in
  267. // glibc 2.34 and later.
  268. if (unsigned *psizeof = static_cast<unsigned *>(
  269. dlsym(RTLD_DEFAULT, "_thread_db_sizeof_pthread")))
  270. val = *psizeof;
  271. if (!val)
  272. val = ThreadDescriptorSizeFallback();
  273. atomic_store_relaxed(&thread_descriptor_size, val);
  274. return val;
  275. }
  276. #if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
  277. // TlsPreTcbSize includes size of struct pthread_descr and size of tcb
  278. // head structure. It lies before the static tls blocks.
  279. static uptr TlsPreTcbSize() {
  280. #if defined(__mips__)
  281. const uptr kTcbHead = 16; // sizeof (tcbhead_t)
  282. #elif defined(__powerpc64__)
  283. const uptr kTcbHead = 88; // sizeof (tcbhead_t)
  284. #elif SANITIZER_RISCV64
  285. const uptr kTcbHead = 16; // sizeof (tcbhead_t)
  286. #endif
  287. const uptr kTlsAlign = 16;
  288. const uptr kTlsPreTcbSize =
  289. RoundUpTo(ThreadDescriptorSize() + kTcbHead, kTlsAlign);
  290. return kTlsPreTcbSize;
  291. }
  292. #endif
  293. namespace {
  294. struct TlsBlock {
  295. uptr begin, end, align;
  296. size_t tls_modid;
  297. bool operator<(const TlsBlock &rhs) const { return begin < rhs.begin; }
  298. };
  299. } // namespace
  300. #ifdef __s390__
  301. extern "C" uptr __tls_get_offset(void *arg);
  302. static uptr TlsGetOffset(uptr ti_module, uptr ti_offset) {
  303. // The __tls_get_offset ABI requires %r12 to point to GOT and %r2 to be an
  304. // offset of a struct tls_index inside GOT. We don't possess either of the
  305. // two, so violate the letter of the "ELF Handling For Thread-Local
  306. // Storage" document and assume that the implementation just dereferences
  307. // %r2 + %r12.
  308. uptr tls_index[2] = {ti_module, ti_offset};
  309. register uptr r2 asm("2") = 0;
  310. register void *r12 asm("12") = tls_index;
  311. asm("basr %%r14, %[__tls_get_offset]"
  312. : "+r"(r2)
  313. : [__tls_get_offset] "r"(__tls_get_offset), "r"(r12)
  314. : "memory", "cc", "0", "1", "3", "4", "5", "14");
  315. return r2;
  316. }
  317. #else
  318. extern "C" void *__tls_get_addr(size_t *);
  319. #endif
  320. static int CollectStaticTlsBlocks(struct dl_phdr_info *info, size_t size,
  321. void *data) {
  322. if (!info->dlpi_tls_modid)
  323. return 0;
  324. uptr begin = (uptr)info->dlpi_tls_data;
  325. if (!g_use_dlpi_tls_data) {
  326. // Call __tls_get_addr as a fallback. This forces TLS allocation on glibc
  327. // and FreeBSD.
  328. #ifdef __s390__
  329. begin = (uptr)__builtin_thread_pointer() +
  330. TlsGetOffset(info->dlpi_tls_modid, 0);
  331. #else
  332. size_t mod_and_off[2] = {info->dlpi_tls_modid, 0};
  333. begin = (uptr)__tls_get_addr(mod_and_off);
  334. #endif
  335. }
  336. for (unsigned i = 0; i != info->dlpi_phnum; ++i)
  337. if (info->dlpi_phdr[i].p_type == PT_TLS) {
  338. static_cast<InternalMmapVector<TlsBlock> *>(data)->push_back(
  339. TlsBlock{begin, begin + info->dlpi_phdr[i].p_memsz,
  340. info->dlpi_phdr[i].p_align, info->dlpi_tls_modid});
  341. break;
  342. }
  343. return 0;
  344. }
  345. __attribute__((unused)) static void GetStaticTlsBoundary(uptr *addr, uptr *size,
  346. uptr *align) {
  347. InternalMmapVector<TlsBlock> ranges;
  348. dl_iterate_phdr(CollectStaticTlsBlocks, &ranges);
  349. uptr len = ranges.size();
  350. Sort(ranges.begin(), len);
  351. // Find the range with tls_modid=1. For glibc, because libc.so uses PT_TLS,
  352. // this module is guaranteed to exist and is one of the initially loaded
  353. // modules.
  354. uptr one = 0;
  355. while (one != len && ranges[one].tls_modid != 1) ++one;
  356. if (one == len) {
  357. // This may happen with musl if no module uses PT_TLS.
  358. *addr = 0;
  359. *size = 0;
  360. *align = 1;
  361. return;
  362. }
  363. // Find the maximum consecutive ranges. We consider two modules consecutive if
  364. // the gap is smaller than the alignment. The dynamic loader places static TLS
  365. // blocks this way not to waste space.
  366. uptr l = one;
  367. *align = ranges[l].align;
  368. while (l != 0 && ranges[l].begin < ranges[l - 1].end + ranges[l - 1].align)
  369. *align = Max(*align, ranges[--l].align);
  370. uptr r = one + 1;
  371. while (r != len && ranges[r].begin < ranges[r - 1].end + ranges[r - 1].align)
  372. *align = Max(*align, ranges[r++].align);
  373. *addr = ranges[l].begin;
  374. *size = ranges[r - 1].end - ranges[l].begin;
  375. }
  376. #endif // (x86_64 || i386 || mips || ...) && (SANITIZER_FREEBSD ||
  377. // SANITIZER_LINUX) && !SANITIZER_ANDROID && !SANITIZER_GO
  378. #if SANITIZER_NETBSD
  379. static struct tls_tcb * ThreadSelfTlsTcb() {
  380. struct tls_tcb *tcb = nullptr;
  381. #ifdef __HAVE___LWP_GETTCB_FAST
  382. tcb = (struct tls_tcb *)__lwp_gettcb_fast();
  383. #elif defined(__HAVE___LWP_GETPRIVATE_FAST)
  384. tcb = (struct tls_tcb *)__lwp_getprivate_fast();
  385. #endif
  386. return tcb;
  387. }
  388. uptr ThreadSelf() {
  389. return (uptr)ThreadSelfTlsTcb()->tcb_pthread;
  390. }
  391. int GetSizeFromHdr(struct dl_phdr_info *info, size_t size, void *data) {
  392. const Elf_Phdr *hdr = info->dlpi_phdr;
  393. const Elf_Phdr *last_hdr = hdr + info->dlpi_phnum;
  394. for (; hdr != last_hdr; ++hdr) {
  395. if (hdr->p_type == PT_TLS && info->dlpi_tls_modid == 1) {
  396. *(uptr*)data = hdr->p_memsz;
  397. break;
  398. }
  399. }
  400. return 0;
  401. }
  402. #endif // SANITIZER_NETBSD
  403. #if SANITIZER_ANDROID
  404. // Bionic provides this API since S.
  405. extern "C" SANITIZER_WEAK_ATTRIBUTE void __libc_get_static_tls_bounds(void **,
  406. void **);
  407. #endif
  408. #if !SANITIZER_GO
  409. static void GetTls(uptr *addr, uptr *size) {
  410. #if SANITIZER_ANDROID
  411. if (&__libc_get_static_tls_bounds) {
  412. void *start_addr;
  413. void *end_addr;
  414. __libc_get_static_tls_bounds(&start_addr, &end_addr);
  415. *addr = reinterpret_cast<uptr>(start_addr);
  416. *size =
  417. reinterpret_cast<uptr>(end_addr) - reinterpret_cast<uptr>(start_addr);
  418. } else {
  419. *addr = 0;
  420. *size = 0;
  421. }
  422. #elif SANITIZER_GLIBC && defined(__x86_64__)
  423. // For aarch64 and x86-64, use an O(1) approach which requires relatively
  424. // precise ThreadDescriptorSize. g_tls_size was initialized in InitTlsSize.
  425. asm("mov %%fs:16,%0" : "=r"(*addr));
  426. *size = g_tls_size;
  427. *addr -= *size;
  428. *addr += ThreadDescriptorSize();
  429. #elif SANITIZER_GLIBC && defined(__aarch64__)
  430. *addr = reinterpret_cast<uptr>(__builtin_thread_pointer()) -
  431. ThreadDescriptorSize();
  432. *size = g_tls_size + ThreadDescriptorSize();
  433. #elif SANITIZER_GLIBC && defined(__powerpc64__)
  434. // Workaround for glibc<2.25(?). 2.27 is known to not need this.
  435. uptr tp;
  436. asm("addi %0,13,-0x7000" : "=r"(tp));
  437. const uptr pre_tcb_size = TlsPreTcbSize();
  438. *addr = tp - pre_tcb_size;
  439. *size = g_tls_size + pre_tcb_size;
  440. #elif SANITIZER_FREEBSD || SANITIZER_LINUX
  441. uptr align;
  442. GetStaticTlsBoundary(addr, size, &align);
  443. #if defined(__x86_64__) || defined(__i386__) || defined(__s390__) || \
  444. defined(__sparc__)
  445. if (SANITIZER_GLIBC) {
  446. #if defined(__x86_64__) || defined(__i386__)
  447. align = Max<uptr>(align, 64);
  448. #else
  449. align = Max<uptr>(align, 16);
  450. #endif
  451. }
  452. const uptr tp = RoundUpTo(*addr + *size, align);
  453. // lsan requires the range to additionally cover the static TLS surplus
  454. // (elf/dl-tls.c defines 1664). Otherwise there may be false positives for
  455. // allocations only referenced by tls in dynamically loaded modules.
  456. if (SANITIZER_GLIBC)
  457. *size += 1644;
  458. else if (SANITIZER_FREEBSD)
  459. *size += 128; // RTLD_STATIC_TLS_EXTRA
  460. // Extend the range to include the thread control block. On glibc, lsan needs
  461. // the range to include pthread::{specific_1stblock,specific} so that
  462. // allocations only referenced by pthread_setspecific can be scanned. This may
  463. // underestimate by at most TLS_TCB_ALIGN-1 bytes but it should be fine
  464. // because the number of bytes after pthread::specific is larger.
  465. *addr = tp - RoundUpTo(*size, align);
  466. *size = tp - *addr + ThreadDescriptorSize();
  467. #else
  468. if (SANITIZER_GLIBC)
  469. *size += 1664;
  470. else if (SANITIZER_FREEBSD)
  471. *size += 128; // RTLD_STATIC_TLS_EXTRA
  472. #if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
  473. const uptr pre_tcb_size = TlsPreTcbSize();
  474. *addr -= pre_tcb_size;
  475. *size += pre_tcb_size;
  476. #else
  477. // arm and aarch64 reserve two words at TP, so this underestimates the range.
  478. // However, this is sufficient for the purpose of finding the pointers to
  479. // thread-specific data keys.
  480. const uptr tcb_size = ThreadDescriptorSize();
  481. *addr -= tcb_size;
  482. *size += tcb_size;
  483. #endif
  484. #endif
  485. #elif SANITIZER_NETBSD
  486. struct tls_tcb * const tcb = ThreadSelfTlsTcb();
  487. *addr = 0;
  488. *size = 0;
  489. if (tcb != 0) {
  490. // Find size (p_memsz) of dlpi_tls_modid 1 (TLS block of the main program).
  491. // ld.elf_so hardcodes the index 1.
  492. dl_iterate_phdr(GetSizeFromHdr, size);
  493. if (*size != 0) {
  494. // The block has been found and tcb_dtv[1] contains the base address
  495. *addr = (uptr)tcb->tcb_dtv[1];
  496. }
  497. }
  498. #elif SANITIZER_SOLARIS
  499. // FIXME
  500. *addr = 0;
  501. *size = 0;
  502. #else
  503. #error "Unknown OS"
  504. #endif
  505. }
  506. #endif
  507. #if !SANITIZER_GO
  508. uptr GetTlsSize() {
  509. #if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
  510. SANITIZER_SOLARIS
  511. uptr addr, size;
  512. GetTls(&addr, &size);
  513. return size;
  514. #else
  515. return 0;
  516. #endif
  517. }
  518. #endif
  519. void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size,
  520. uptr *tls_addr, uptr *tls_size) {
  521. #if SANITIZER_GO
  522. // Stub implementation for Go.
  523. *stk_addr = *stk_size = *tls_addr = *tls_size = 0;
  524. #else
  525. GetTls(tls_addr, tls_size);
  526. uptr stack_top, stack_bottom;
  527. GetThreadStackTopAndBottom(main, &stack_top, &stack_bottom);
  528. *stk_addr = stack_bottom;
  529. *stk_size = stack_top - stack_bottom;
  530. if (!main) {
  531. // If stack and tls intersect, make them non-intersecting.
  532. if (*tls_addr > *stk_addr && *tls_addr < *stk_addr + *stk_size) {
  533. if (*stk_addr + *stk_size < *tls_addr + *tls_size)
  534. *tls_size = *stk_addr + *stk_size - *tls_addr;
  535. *stk_size = *tls_addr - *stk_addr;
  536. }
  537. }
  538. #endif
  539. }
  540. #if !SANITIZER_FREEBSD
  541. typedef ElfW(Phdr) Elf_Phdr;
  542. #elif SANITIZER_WORDSIZE == 32 && __FreeBSD_version <= 902001 // v9.2
  543. #define Elf_Phdr XElf32_Phdr
  544. #define dl_phdr_info xdl_phdr_info
  545. #define dl_iterate_phdr(c, b) xdl_iterate_phdr((c), (b))
  546. #endif // !SANITIZER_FREEBSD
  547. struct DlIteratePhdrData {
  548. InternalMmapVectorNoCtor<LoadedModule> *modules;
  549. bool first;
  550. };
  551. static int AddModuleSegments(const char *module_name, dl_phdr_info *info,
  552. InternalMmapVectorNoCtor<LoadedModule> *modules) {
  553. if (module_name[0] == '\0')
  554. return 0;
  555. LoadedModule cur_module;
  556. cur_module.set(module_name, info->dlpi_addr);
  557. for (int i = 0; i < (int)info->dlpi_phnum; i++) {
  558. const Elf_Phdr *phdr = &info->dlpi_phdr[i];
  559. if (phdr->p_type == PT_LOAD) {
  560. uptr cur_beg = info->dlpi_addr + phdr->p_vaddr;
  561. uptr cur_end = cur_beg + phdr->p_memsz;
  562. bool executable = phdr->p_flags & PF_X;
  563. bool writable = phdr->p_flags & PF_W;
  564. cur_module.addAddressRange(cur_beg, cur_end, executable,
  565. writable);
  566. } else if (phdr->p_type == PT_NOTE) {
  567. # ifdef NT_GNU_BUILD_ID
  568. uptr off = 0;
  569. while (off + sizeof(ElfW(Nhdr)) < phdr->p_memsz) {
  570. auto *nhdr = reinterpret_cast<const ElfW(Nhdr) *>(info->dlpi_addr +
  571. phdr->p_vaddr + off);
  572. constexpr auto kGnuNamesz = 4; // "GNU" with NUL-byte.
  573. static_assert(kGnuNamesz % 4 == 0, "kGnuNameSize is aligned to 4.");
  574. if (nhdr->n_type == NT_GNU_BUILD_ID && nhdr->n_namesz == kGnuNamesz) {
  575. if (off + sizeof(ElfW(Nhdr)) + nhdr->n_namesz + nhdr->n_descsz >
  576. phdr->p_memsz) {
  577. // Something is very wrong, bail out instead of reading potentially
  578. // arbitrary memory.
  579. break;
  580. }
  581. const char *name =
  582. reinterpret_cast<const char *>(nhdr) + sizeof(*nhdr);
  583. if (internal_memcmp(name, "GNU", 3) == 0) {
  584. const char *value = reinterpret_cast<const char *>(nhdr) +
  585. sizeof(*nhdr) + kGnuNamesz;
  586. cur_module.setUuid(value, nhdr->n_descsz);
  587. break;
  588. }
  589. }
  590. off += sizeof(*nhdr) + RoundUpTo(nhdr->n_namesz, 4) +
  591. RoundUpTo(nhdr->n_descsz, 4);
  592. }
  593. # endif
  594. }
  595. }
  596. modules->push_back(cur_module);
  597. return 0;
  598. }
  599. static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {
  600. DlIteratePhdrData *data = (DlIteratePhdrData *)arg;
  601. if (data->first) {
  602. InternalMmapVector<char> module_name(kMaxPathLength);
  603. data->first = false;
  604. // First module is the binary itself.
  605. ReadBinaryNameCached(module_name.data(), module_name.size());
  606. return AddModuleSegments(module_name.data(), info, data->modules);
  607. }
  608. if (info->dlpi_name) {
  609. InternalScopedString module_name;
  610. module_name.append("%s", info->dlpi_name);
  611. return AddModuleSegments(module_name.data(), info, data->modules);
  612. }
  613. return 0;
  614. }
  615. #if SANITIZER_ANDROID && __ANDROID_API__ < 21
  616. extern "C" __attribute__((weak)) int dl_iterate_phdr(
  617. int (*)(struct dl_phdr_info *, size_t, void *), void *);
  618. #endif
  619. static bool requiresProcmaps() {
  620. #if SANITIZER_ANDROID && __ANDROID_API__ <= 22
  621. // Fall back to /proc/maps if dl_iterate_phdr is unavailable or broken.
  622. // The runtime check allows the same library to work with
  623. // both K and L (and future) Android releases.
  624. return AndroidGetApiLevel() <= ANDROID_LOLLIPOP_MR1;
  625. #else
  626. return false;
  627. #endif
  628. }
  629. static void procmapsInit(InternalMmapVectorNoCtor<LoadedModule> *modules) {
  630. MemoryMappingLayout memory_mapping(/*cache_enabled*/true);
  631. memory_mapping.DumpListOfModules(modules);
  632. }
  633. void ListOfModules::init() {
  634. clearOrInit();
  635. if (requiresProcmaps()) {
  636. procmapsInit(&modules_);
  637. } else {
  638. DlIteratePhdrData data = {&modules_, true};
  639. dl_iterate_phdr(dl_iterate_phdr_cb, &data);
  640. }
  641. }
  642. // When a custom loader is used, dl_iterate_phdr may not contain the full
  643. // list of modules. Allow callers to fall back to using procmaps.
  644. void ListOfModules::fallbackInit() {
  645. if (!requiresProcmaps()) {
  646. clearOrInit();
  647. procmapsInit(&modules_);
  648. } else {
  649. clear();
  650. }
  651. }
  652. // getrusage does not give us the current RSS, only the max RSS.
  653. // Still, this is better than nothing if /proc/self/statm is not available
  654. // for some reason, e.g. due to a sandbox.
  655. static uptr GetRSSFromGetrusage() {
  656. struct rusage usage;
  657. if (getrusage(RUSAGE_SELF, &usage)) // Failed, probably due to a sandbox.
  658. return 0;
  659. return usage.ru_maxrss << 10; // ru_maxrss is in Kb.
  660. }
  661. uptr GetRSS() {
  662. if (!common_flags()->can_use_proc_maps_statm)
  663. return GetRSSFromGetrusage();
  664. fd_t fd = OpenFile("/proc/self/statm", RdOnly);
  665. if (fd == kInvalidFd)
  666. return GetRSSFromGetrusage();
  667. char buf[64];
  668. uptr len = internal_read(fd, buf, sizeof(buf) - 1);
  669. internal_close(fd);
  670. if ((sptr)len <= 0)
  671. return 0;
  672. buf[len] = 0;
  673. // The format of the file is:
  674. // 1084 89 69 11 0 79 0
  675. // We need the second number which is RSS in pages.
  676. char *pos = buf;
  677. // Skip the first number.
  678. while (*pos >= '0' && *pos <= '9')
  679. pos++;
  680. // Skip whitespaces.
  681. while (!(*pos >= '0' && *pos <= '9') && *pos != 0)
  682. pos++;
  683. // Read the number.
  684. uptr rss = 0;
  685. while (*pos >= '0' && *pos <= '9')
  686. rss = rss * 10 + *pos++ - '0';
  687. return rss * GetPageSizeCached();
  688. }
  689. // sysconf(_SC_NPROCESSORS_{CONF,ONLN}) cannot be used on most platforms as
  690. // they allocate memory.
  691. u32 GetNumberOfCPUs() {
  692. #if SANITIZER_FREEBSD || SANITIZER_NETBSD
  693. u32 ncpu;
  694. int req[2];
  695. uptr len = sizeof(ncpu);
  696. req[0] = CTL_HW;
  697. req[1] = HW_NCPU;
  698. CHECK_EQ(internal_sysctl(req, 2, &ncpu, &len, NULL, 0), 0);
  699. return ncpu;
  700. #elif SANITIZER_ANDROID && !defined(CPU_COUNT) && !defined(__aarch64__)
  701. // Fall back to /sys/devices/system/cpu on Android when cpu_set_t doesn't
  702. // exist in sched.h. That is the case for toolchains generated with older
  703. // NDKs.
  704. // This code doesn't work on AArch64 because internal_getdents makes use of
  705. // the 64bit getdents syscall, but cpu_set_t seems to always exist on AArch64.
  706. uptr fd = internal_open("/sys/devices/system/cpu", O_RDONLY | O_DIRECTORY);
  707. if (internal_iserror(fd))
  708. return 0;
  709. InternalMmapVector<u8> buffer(4096);
  710. uptr bytes_read = buffer.size();
  711. uptr n_cpus = 0;
  712. u8 *d_type;
  713. struct linux_dirent *entry = (struct linux_dirent *)&buffer[bytes_read];
  714. while (true) {
  715. if ((u8 *)entry >= &buffer[bytes_read]) {
  716. bytes_read = internal_getdents(fd, (struct linux_dirent *)buffer.data(),
  717. buffer.size());
  718. if (internal_iserror(bytes_read) || !bytes_read)
  719. break;
  720. entry = (struct linux_dirent *)buffer.data();
  721. }
  722. d_type = (u8 *)entry + entry->d_reclen - 1;
  723. if (d_type >= &buffer[bytes_read] ||
  724. (u8 *)&entry->d_name[3] >= &buffer[bytes_read])
  725. break;
  726. if (entry->d_ino != 0 && *d_type == DT_DIR) {
  727. if (entry->d_name[0] == 'c' && entry->d_name[1] == 'p' &&
  728. entry->d_name[2] == 'u' &&
  729. entry->d_name[3] >= '0' && entry->d_name[3] <= '9')
  730. n_cpus++;
  731. }
  732. entry = (struct linux_dirent *)(((u8 *)entry) + entry->d_reclen);
  733. }
  734. internal_close(fd);
  735. return n_cpus;
  736. #elif SANITIZER_SOLARIS
  737. return sysconf(_SC_NPROCESSORS_ONLN);
  738. #else
  739. cpu_set_t CPUs;
  740. CHECK_EQ(sched_getaffinity(0, sizeof(cpu_set_t), &CPUs), 0);
  741. return CPU_COUNT(&CPUs);
  742. #endif
  743. }
  744. #if SANITIZER_LINUX
  745. #if SANITIZER_ANDROID
  746. static atomic_uint8_t android_log_initialized;
  747. void AndroidLogInit() {
  748. openlog(GetProcessName(), 0, LOG_USER);
  749. atomic_store(&android_log_initialized, 1, memory_order_release);
  750. }
  751. static bool ShouldLogAfterPrintf() {
  752. return atomic_load(&android_log_initialized, memory_order_acquire);
  753. }
  754. extern "C" SANITIZER_WEAK_ATTRIBUTE
  755. int async_safe_write_log(int pri, const char* tag, const char* msg);
  756. extern "C" SANITIZER_WEAK_ATTRIBUTE
  757. int __android_log_write(int prio, const char* tag, const char* msg);
  758. // ANDROID_LOG_INFO is 4, but can't be resolved at runtime.
  759. #define SANITIZER_ANDROID_LOG_INFO 4
  760. // async_safe_write_log is a new public version of __libc_write_log that is
  761. // used behind syslog. It is preferable to syslog as it will not do any dynamic
  762. // memory allocation or formatting.
  763. // If the function is not available, syslog is preferred for L+ (it was broken
  764. // pre-L) as __android_log_write triggers a racey behavior with the strncpy
  765. // interceptor. Fallback to __android_log_write pre-L.
  766. void WriteOneLineToSyslog(const char *s) {
  767. if (&async_safe_write_log) {
  768. async_safe_write_log(SANITIZER_ANDROID_LOG_INFO, GetProcessName(), s);
  769. } else if (AndroidGetApiLevel() > ANDROID_KITKAT) {
  770. syslog(LOG_INFO, "%s", s);
  771. } else {
  772. CHECK(&__android_log_write);
  773. __android_log_write(SANITIZER_ANDROID_LOG_INFO, nullptr, s);
  774. }
  775. }
  776. extern "C" SANITIZER_WEAK_ATTRIBUTE
  777. void android_set_abort_message(const char *);
  778. void SetAbortMessage(const char *str) {
  779. if (&android_set_abort_message)
  780. android_set_abort_message(str);
  781. }
  782. #else
  783. void AndroidLogInit() {}
  784. static bool ShouldLogAfterPrintf() { return true; }
  785. void WriteOneLineToSyslog(const char *s) { syslog(LOG_INFO, "%s", s); }
  786. void SetAbortMessage(const char *str) {}
  787. #endif // SANITIZER_ANDROID
  788. void LogMessageOnPrintf(const char *str) {
  789. if (common_flags()->log_to_syslog && ShouldLogAfterPrintf())
  790. WriteToSyslog(str);
  791. }
  792. #endif // SANITIZER_LINUX
  793. #if SANITIZER_GLIBC && !SANITIZER_GO
  794. // glibc crashes when using clock_gettime from a preinit_array function as the
  795. // vDSO function pointers haven't been initialized yet. __progname is
  796. // initialized after the vDSO function pointers, so if it exists, is not null
  797. // and is not empty, we can use clock_gettime.
  798. extern "C" SANITIZER_WEAK_ATTRIBUTE char *__progname;
  799. inline bool CanUseVDSO() { return &__progname && __progname && *__progname; }
  800. // MonotonicNanoTime is a timing function that can leverage the vDSO by calling
  801. // clock_gettime. real_clock_gettime only exists if clock_gettime is
  802. // intercepted, so define it weakly and use it if available.
  803. extern "C" SANITIZER_WEAK_ATTRIBUTE
  804. int real_clock_gettime(u32 clk_id, void *tp);
  805. u64 MonotonicNanoTime() {
  806. timespec ts;
  807. if (CanUseVDSO()) {
  808. if (&real_clock_gettime)
  809. real_clock_gettime(CLOCK_MONOTONIC, &ts);
  810. else
  811. clock_gettime(CLOCK_MONOTONIC, &ts);
  812. } else {
  813. internal_clock_gettime(CLOCK_MONOTONIC, &ts);
  814. }
  815. return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
  816. }
  817. #else
  818. // Non-glibc & Go always use the regular function.
  819. u64 MonotonicNanoTime() {
  820. timespec ts;
  821. clock_gettime(CLOCK_MONOTONIC, &ts);
  822. return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
  823. }
  824. #endif // SANITIZER_GLIBC && !SANITIZER_GO
  825. void ReExec() {
  826. const char *pathname = "/proc/self/exe";
  827. #if SANITIZER_NETBSD
  828. static const int name[] = {
  829. CTL_KERN,
  830. KERN_PROC_ARGS,
  831. -1,
  832. KERN_PROC_PATHNAME,
  833. };
  834. char path[400];
  835. uptr len;
  836. len = sizeof(path);
  837. if (internal_sysctl(name, ARRAY_SIZE(name), path, &len, NULL, 0) != -1)
  838. pathname = path;
  839. #elif SANITIZER_SOLARIS
  840. pathname = getexecname();
  841. CHECK_NE(pathname, NULL);
  842. #elif SANITIZER_USE_GETAUXVAL
  843. // Calling execve with /proc/self/exe sets that as $EXEC_ORIGIN. Binaries that
  844. // rely on that will fail to load shared libraries. Query AT_EXECFN instead.
  845. pathname = reinterpret_cast<const char *>(getauxval(AT_EXECFN));
  846. #endif
  847. uptr rv = internal_execve(pathname, GetArgv(), GetEnviron());
  848. int rverrno;
  849. CHECK_EQ(internal_iserror(rv, &rverrno), true);
  850. Printf("execve failed, errno %d\n", rverrno);
  851. Die();
  852. }
  853. void UnmapFromTo(uptr from, uptr to) {
  854. if (to == from)
  855. return;
  856. CHECK(to >= from);
  857. uptr res = internal_munmap(reinterpret_cast<void *>(from), to - from);
  858. if (UNLIKELY(internal_iserror(res))) {
  859. Report("ERROR: %s failed to unmap 0x%zx (%zd) bytes at address %p\n",
  860. SanitizerToolName, to - from, to - from, (void *)from);
  861. CHECK("unable to unmap" && 0);
  862. }
  863. }
  864. uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale,
  865. uptr min_shadow_base_alignment,
  866. UNUSED uptr &high_mem_end) {
  867. const uptr granularity = GetMmapGranularity();
  868. const uptr alignment =
  869. Max<uptr>(granularity << shadow_scale, 1ULL << min_shadow_base_alignment);
  870. const uptr left_padding =
  871. Max<uptr>(granularity, 1ULL << min_shadow_base_alignment);
  872. const uptr shadow_size = RoundUpTo(shadow_size_bytes, granularity);
  873. const uptr map_size = shadow_size + left_padding + alignment;
  874. const uptr map_start = (uptr)MmapNoAccess(map_size);
  875. CHECK_NE(map_start, ~(uptr)0);
  876. const uptr shadow_start = RoundUpTo(map_start + left_padding, alignment);
  877. UnmapFromTo(map_start, shadow_start - left_padding);
  878. UnmapFromTo(shadow_start + shadow_size, map_start + map_size);
  879. return shadow_start;
  880. }
  881. static uptr MmapSharedNoReserve(uptr addr, uptr size) {
  882. return internal_mmap(
  883. reinterpret_cast<void *>(addr), size, PROT_READ | PROT_WRITE,
  884. MAP_FIXED | MAP_SHARED | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
  885. }
  886. static uptr MremapCreateAlias(uptr base_addr, uptr alias_addr,
  887. uptr alias_size) {
  888. #if SANITIZER_LINUX
  889. return internal_mremap(reinterpret_cast<void *>(base_addr), 0, alias_size,
  890. MREMAP_MAYMOVE | MREMAP_FIXED,
  891. reinterpret_cast<void *>(alias_addr));
  892. #else
  893. CHECK(false && "mremap is not supported outside of Linux");
  894. return 0;
  895. #endif
  896. }
  897. static void CreateAliases(uptr start_addr, uptr alias_size, uptr num_aliases) {
  898. uptr total_size = alias_size * num_aliases;
  899. uptr mapped = MmapSharedNoReserve(start_addr, total_size);
  900. CHECK_EQ(mapped, start_addr);
  901. for (uptr i = 1; i < num_aliases; ++i) {
  902. uptr alias_addr = start_addr + i * alias_size;
  903. CHECK_EQ(MremapCreateAlias(start_addr, alias_addr, alias_size), alias_addr);
  904. }
  905. }
  906. uptr MapDynamicShadowAndAliases(uptr shadow_size, uptr alias_size,
  907. uptr num_aliases, uptr ring_buffer_size) {
  908. CHECK_EQ(alias_size & (alias_size - 1), 0);
  909. CHECK_EQ(num_aliases & (num_aliases - 1), 0);
  910. CHECK_EQ(ring_buffer_size & (ring_buffer_size - 1), 0);
  911. const uptr granularity = GetMmapGranularity();
  912. shadow_size = RoundUpTo(shadow_size, granularity);
  913. CHECK_EQ(shadow_size & (shadow_size - 1), 0);
  914. const uptr alias_region_size = alias_size * num_aliases;
  915. const uptr alignment =
  916. 2 * Max(Max(shadow_size, alias_region_size), ring_buffer_size);
  917. const uptr left_padding = ring_buffer_size;
  918. const uptr right_size = alignment;
  919. const uptr map_size = left_padding + 2 * alignment;
  920. const uptr map_start = reinterpret_cast<uptr>(MmapNoAccess(map_size));
  921. CHECK_NE(map_start, static_cast<uptr>(-1));
  922. const uptr right_start = RoundUpTo(map_start + left_padding, alignment);
  923. UnmapFromTo(map_start, right_start - left_padding);
  924. UnmapFromTo(right_start + right_size, map_start + map_size);
  925. CreateAliases(right_start + right_size / 2, alias_size, num_aliases);
  926. return right_start;
  927. }
  928. void InitializePlatformCommonFlags(CommonFlags *cf) {
  929. #if SANITIZER_ANDROID
  930. if (&__libc_get_static_tls_bounds == nullptr)
  931. cf->detect_leaks = false;
  932. #endif
  933. }
  934. } // namespace __sanitizer
  935. #endif