From 284068f44fd1ad2d22980ea39f49d2c1b74014c7 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Thu, 19 Nov 2015 14:24:06 -0800 Subject: [PATCH] Fix tsan abort for lake of __libc_auxv initialization. If tsan is used, the following callchain can happen: __libc_preinit() -> __libc_init_globals() -> __libc_init_vdso() -> strcmp() -> __tsan_init() -> sysconf(_SC_PAGE_SIZE) -> getauxval(). But __libc_auxv is initialized in __libc_init_common(), after __libc_init_globals(). One simple way to fix this is to initialize __libc_auxv at __libc_init_globals(). Bug: 25392375 Change-Id: I3893b1f567d5f3b7a8c881c0c1b8234b06b7751b --- libc/bionic/libc_init_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/bionic/libc_init_common.cpp b/libc/bionic/libc_init_common.cpp index a6837481f..8f1ee9569 100644 --- a/libc/bionic/libc_init_common.cpp +++ b/libc/bionic/libc_init_common.cpp @@ -110,6 +110,7 @@ void __libc_init_globals(KernelArgumentBlock& args) { // Initialize libc globals that are needed in both the linker and in libc. // In dynamic binaries, this is run at least twice for different copies of the // globals, once for the linker's copy and once for the one in libc.so. + __libc_auxv = args.auxv; __libc_globals.initialize(); __libc_globals.mutate([&args](libc_globals* globals) { __libc_init_vdso(globals, args); @@ -121,7 +122,6 @@ void __libc_init_common(KernelArgumentBlock& args) { // Initialize various globals. environ = args.envp; errno = 0; - __libc_auxv = args.auxv; __progname = args.argv[0] ? args.argv[0] : ""; __abort_message_ptr = args.abort_message_ptr;