[compiler-rt] r349817 - [sanitizer] Support running without fd 0, 1, 2.

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 21 12:09:11 PST 2018


Hi Rumeet,

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


More information about the llvm-commits mailing list