<div dir="ltr">Hi Evgeniy,<div><br></div><div>With your commit, the following compiler-rt test fails:<br>





<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-s1" style="font-variant-ligatures:no-common-ligatures">test/tsan/Linux/check_memcpy.cc<br><br>It seems that following callq sequence is found in input.<br>CHECK-NOT </span><span style="white-space:pre-wrap;font-family:Arial,Helvetica,sans-serif;font-size:small">callq {{.*<(__interceptor_)?mem(cpy|set)>}}"</span></p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-s1" style="font-variant-ligatures:no-common-ligatures"><br>Could you please take a look?</span></p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-s1" style="font-variant-ligatures:no-common-ligatures"><br></span></p></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 20, 2018 at 12:39 PM Evgeniy Stepanov 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: eugenis<br>
Date: Thu Dec 20 12:36:33 2018<br>
New Revision: 349817<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=349817&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=349817&view=rev</a><br>
Log:<br>
[sanitizer] Support running without fd 0,1,2.<br>
<br>
Summary:<br>
Support running with no open file descriptors (as may happen to<br>
"init" process on linux).<br>
* Remove a check that writing to stderr succeeds.<br>
* When opening a file (ex. for log_path option), dup the new fd out of<br>
[0, 2] range to avoid confusing the program.<br>
<br>
(2nd attempt, this time without the sanitizer_rtems change)<br>
<br>
Reviewers: pcc, vitalybuka<br>
<br>
Subscribers: kubamracek, llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D55801" rel="noreferrer" target="_blank">https://reviews.llvm.org/D55801</a><br>
<br>
Added:<br>
    compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_netbsd.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_solaris.cc<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=349817&r1=349816&r2=349817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=349817&r1=349816&r2=349817&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Thu Dec 20 12:36:33 2018<br>
@@ -381,6 +381,10 @@ uptr internal_filesize(fd_t fd) {<br>
   return (uptr)st.st_size;<br>
 }<br>
<br>
+uptr internal_dup(int oldfd) {<br>
+  return internal_syscall(SYSCALL(dup), oldfd);<br>
+}<br>
+<br>
 uptr internal_dup2(int oldfd, int newfd) {<br>
 #if SANITIZER_USES_CANONICAL_LINUX_SYSCALLS<br>
   return internal_syscall(SYSCALL(dup3), oldfd, newfd, 0);<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=349817&r1=349816&r2=349817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=349817&r1=349816&r2=349817&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Thu Dec 20 12:36:33 2018<br>
@@ -174,6 +174,10 @@ uptr internal_filesize(fd_t fd) {<br>
   return (uptr)st.st_size;<br>
 }<br>
<br>
+uptr internal_dup(int oldfd) {<br>
+  return dup(oldfd);<br>
+}<br>
+<br>
 uptr internal_dup2(int oldfd, int newfd) {<br>
   return dup2(oldfd, newfd);<br>
 }<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_netbsd.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_netbsd.cc?rev=349817&r1=349816&r2=349817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_netbsd.cc?rev=349817&r1=349816&r2=349817&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_netbsd.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_netbsd.cc Thu Dec 20 12:36:33 2018<br>
@@ -169,6 +169,11 @@ uptr internal_filesize(fd_t fd) {<br>
   return (uptr)st.st_size;<br>
 }<br>
<br>
+uptr internal_dup(int oldfd) {<br>
+  DEFINE__REAL(int, dup, int a);<br>
+  return _REAL(dup, oldfd);<br>
+}<br>
+<br>
 uptr internal_dup2(int oldfd, int newfd) {<br>
   DEFINE__REAL(int, dup2, int a, int b);<br>
   return _REAL(dup2, oldfd, newfd);<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=349817&r1=349816&r2=349817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=349817&r1=349816&r2=349817&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc Thu Dec 20 12:36:33 2018<br>
@@ -166,7 +166,7 @@ fd_t OpenFile(const char *filename, File<br>
   fd_t res = internal_open(filename, flags, 0660);<br>
   if (internal_iserror(res, errno_p))<br>
     return kInvalidFd;<br>
-  return res;<br>
+  return ReserveStandardFds(res);<br>
 }<br>
<br>
 void CloseFile(fd_t fd) {<br>
@@ -269,13 +269,8 @@ bool IsAbsolutePath(const char *path) {<br>
<br>
 void ReportFile::Write(const char *buffer, uptr length) {<br>
   SpinMutexLock l(mu);<br>
-  static const char *kWriteError =<br>
-      "ReportFile::Write() can't output requested buffer!\n";<br>
   ReopenIfNecessary();<br>
-  if (length != internal_write(fd, buffer, length)) {<br>
-    internal_write(fd, kWriteError, internal_strlen(kWriteError));<br>
-    Die();<br>
-  }<br>
+  internal_write(fd, buffer, length);<br>
 }<br>
<br>
 bool GetCodeRangeForFile(const char *module, uptr *start, uptr *end) {<br>
@@ -323,6 +318,21 @@ const char *SignalContext::Describe() co<br>
   return "UNKNOWN SIGNAL";<br>
 }<br>
<br>
+fd_t ReserveStandardFds(fd_t fd) {<br>
+  CHECK_GE(fd, 0);<br>
+  if (fd > 2)<br>
+    return fd;<br>
+  bool used[3] = {false, false, false};<br>
+  while (fd <= 2) {<br>
+    used[fd] = true;<br>
+    fd = internal_dup(fd);<br>
+  }<br>
+  for (int i = 0; i <= 2; ++i)<br>
+    if (used[i])<br>
+      internal_close(i);<br>
+  return fd;<br>
+}<br>
+<br>
 } // namespace __sanitizer<br>
<br>
 #endif // SANITIZER_POSIX<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h?rev=349817&r1=349816&r2=349817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h?rev=349817&r1=349816&r2=349817&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h Thu Dec 20 12:36:33 2018<br>
@@ -49,6 +49,7 @@ uptr internal_filesize(fd_t fd);  // -1<br>
 uptr internal_stat(const char *path, void *buf);<br>
 uptr internal_lstat(const char *path, void *buf);<br>
 uptr internal_fstat(fd_t fd, void *buf);<br>
+uptr internal_dup(int oldfd);<br>
 uptr internal_dup2(int oldfd, int newfd);<br>
 uptr internal_readlink(const char *path, char *buf, uptr bufsize);<br>
 uptr internal_unlink(const char *path);<br>
@@ -99,6 +100,9 @@ uptr internal_execve(const char *filenam<br>
<br>
 bool IsStateDetached(int state);<br>
<br>
+// Move the fd out of {0, 1, 2} range.<br>
+fd_t ReserveStandardFds(fd_t fd);<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 #endif  // SANITIZER_POSIX_H<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_solaris.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_solaris.cc?rev=349817&r1=349816&r2=349817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_solaris.cc?rev=349817&r1=349816&r2=349817&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_solaris.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_solaris.cc Thu Dec 20 12:36:33 2018<br>
@@ -88,8 +88,8 @@ uptr internal_open(const char *filename,<br>
 }<br>
<br>
 uptr OpenFile(const char *filename, bool write) {<br>
-  return internal_open(filename,<br>
-      write ? O_WRONLY | O_CREAT : O_RDONLY, 0660);<br>
+  return ReserveStandardFds(<br>
+      internal_open(filename, write ? O_WRONLY | O_CREAT : O_RDONLY, 0660));<br>
 }<br>
<br>
 DECLARE__REAL_AND_INTERNAL(uptr, read, fd_t fd, void *buf, uptr count) {<br>
<br>
Added: compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc?rev=349817&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc?rev=349817&view=auto</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc (added)<br>
+++ compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc Thu Dec 20 12:36:33 2018<br>
@@ -0,0 +1,39 @@<br>
+// RUN: %clangxx_asan -O0 %s -o %t<br>
+// RUN: %run %t 2>&1 | FileCheck %s<br>
+// RUN: %env_asan_opts=debug=1,verbosity=2 %run %t 2>&1 | FileCheck %s<br>
+<br>
+// Test ASan initialization<br>
+<br>
+#include <assert.h><br>
+#include <stdio.h><br>
+#include <stdlib.h><br>
+#include <unistd.h><br>
+<br>
+void parent(int argc, char **argv) {<br>
+  fprintf(stderr, "hello\n");<br>
+  // CHECK: hello<br>
+  close(0);<br>
+  close(1);<br>
+  dup2(2, 3);<br>
+  close(2);<br>
+  char *const newargv[] = {argv[0], (char *)"x", nullptr};<br>
+  execv(argv[0], newargv);<br>
+  perror("execve");<br>
+  exit(1);<br>
+}<br>
+<br>
+void child() {<br>
+  assert(dup(3) == 0);<br>
+  assert(dup(3) == 1);<br>
+  assert(dup(3) == 2);<br>
+  fprintf(stderr, "world\n");<br>
+  // CHECK: world<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+  if (argc == 1) {<br>
+    parent(argc, argv);<br>
+  } else {<br>
+    child();<br>
+  }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>