<div dir="ltr"><div>Alex, could you please take a look?</div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/1128/steps/check-sanitizer%20in%20gcc%20build/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/1128/steps/check-sanitizer%20in%20gcc%20build/logs/stdio</a><br><div><br></div><div><pre style="font-family:"courier new",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout">[ 13%] Building CXX object lib/DebugInfo/Symbolize/CMakeFiles/LLVMSymbolize.dir/SymbolizableObjectFile.cpp.o
Scanning dependencies of target LLVMDebugInfoPDB
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc:81:22: fatal error: sys/auxv.h: No such file or directory
 #include <sys/auxv.h>
                      ^
compilation terminated.
make[3]: *** [projects/compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux.cc.o] Error 1
[ 13%] Building CXX object lib/DebugInfo/DWARF/CMakeFiles/LLVMDebugInfoDWARF.dir/DWARFDebugAranges.cpp.o
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc:81:22: fatal error: sys/auxv.h: No such file or directory
 #include <sys/auxv.h>
                      ^
compilation terminated.
[ 13%] Building CXX object lib/DebugInfo/Symbolize/CMakeFiles/LLVMSymbolize.dir/Symbolize.cpp.o
make[3]: *** [projects/compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_linux.cc.o] Error 1
make[2]: *** [projects/compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
make[2]: *** [projects/compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/all] Error 2
[ 13%] Building CXX object lib/DebugInfo/DWARF/CMakeFiles/LLVMDebugInfoDWARF.dir/DWARFDebugInfoEntry.cpp.o
[ 13%] Building CXX object lib/DebugInfo/DWARF/CMakeFiles/LLVMDebugInfoDWARF.dir/DWARFDebugLine.cpp.o
[ 13%] Building CXX object lib/DebugInfo/PDB/CMakeFiles/LLVMDebugInfoPDB.dir/PDBContext.cpp.o</span></pre></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Mar 20, 2017 at 2:15 PM Alex Shlyapnikov via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: alekseyshl<br class="gmail_msg">
Date: Mon Mar 20 16:03:28 2017<br class="gmail_msg">
New Revision: 298305<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=298305&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=298305&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
Bypass potential libc's sysconf wrappers for sysconf(_SC_PAGESIZE) call<br class="gmail_msg">
<br class="gmail_msg">
Summary:<br class="gmail_msg">
sysconf(_SC_PAGESIZE) is called very early, during sanitizer init and<br class="gmail_msg">
any instrumented code (a wrapper/interceptor will likely be instrumented)<br class="gmail_msg">
calling back to sanitizer before init is done will most surely crash.<br class="gmail_msg">
<br class="gmail_msg">
Reviewers: eugenis<br class="gmail_msg">
<br class="gmail_msg">
Subscribers: llvm-commits, kubamracek<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D31092" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D31092</a><br class="gmail_msg">
<br class="gmail_msg">
Added:<br class="gmail_msg">
    compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc<br class="gmail_msg">
Modified:<br class="gmail_msg">
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br class="gmail_msg">
<br class="gmail_msg">
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=298305&r1=298304&r2=298305&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=298305&r1=298304&r2=298305&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)<br class="gmail_msg">
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Mon Mar 20 16:03:28 2017<br class="gmail_msg">
@@ -78,6 +78,7 @@ extern char **environ;  // provided by c<br class="gmail_msg">
 #endif<br class="gmail_msg">
<br class="gmail_msg">
 #if SANITIZER_LINUX<br class="gmail_msg">
+#include <sys/auxv.h><br class="gmail_msg">
 // <linux/time.h><br class="gmail_msg">
 struct kernel_timeval {<br class="gmail_msg">
   long tv_sec;<br class="gmail_msg">
@@ -805,6 +806,8 @@ uptr GetPageSize() {<br class="gmail_msg">
   return 4096;<br class="gmail_msg">
 #elif SANITIZER_LINUX && (defined(__x86_64__) || defined(__i386__))<br class="gmail_msg">
   return EXEC_PAGESIZE;<br class="gmail_msg">
+#elif SANITIZER_LINUX<br class="gmail_msg">
+  return getauxval(AT_PAGESZ);<br class="gmail_msg">
 #else<br class="gmail_msg">
   return sysconf(_SC_PAGESIZE);  // EXEC_PAGESIZE may not be trustworthy.<br class="gmail_msg">
 #endif<br class="gmail_msg">
<br class="gmail_msg">
Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc?rev=298305&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc?rev=298305&view=auto</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc (added)<br class="gmail_msg">
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc Mon Mar 20 16:03:28 2017<br class="gmail_msg">
@@ -0,0 +1,21 @@<br class="gmail_msg">
+// RUN: %clangxx -O2 %s -o %t && %run %t 2>&1 | FileCheck %s<br class="gmail_msg">
+<br class="gmail_msg">
+#include <stdio.h><br class="gmail_msg">
+<br class="gmail_msg">
+extern "C" long sysconf(int name) {<br class="gmail_msg">
+  fprintf(stderr, "sysconf wrapper called\n");<br class="gmail_msg">
+  return 0;<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+int main() {<br class="gmail_msg">
+  // All we need to check is that the sysconf() interceptor defined above was<br class="gmail_msg">
+  // not called. Should it get called, it will crash right there, any<br class="gmail_msg">
+  // instrumented code executed before sanitizer init is finished will crash<br class="gmail_msg">
+  // accessing non-initialized sanitizer internals. Even if it will not crash<br class="gmail_msg">
+  // in some configuration, it should never be called anyway.<br class="gmail_msg">
+  fprintf(stderr, "Passed\n");<br class="gmail_msg">
+  // CHECK-NOT: sysconf wrapper called<br class="gmail_msg">
+  // CHECK: Passed<br class="gmail_msg">
+  // CHECK-NOT: sysconf wrapper called<br class="gmail_msg">
+  return 0;<br class="gmail_msg">
+}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>