tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

find_symbolizer_linux_clang_10.patch (1988B)


      1 We currently need this patch because ASan only searches PATH to find the
      2 llvm-symbolizer binary to symbolize ASan traces. On testing machines, this
      3 can be installed in PATH easily. However, for e.g. the ASan Nightly Project,
      4 where we ship an ASan build, including llvm-symbolizer, to the user, we
      5 cannot expect llvm-symbolizer to be on PATH. Instead, we should try to look
      6 it up next to the binary. This patch implements the functionality for Linux
      7 only until there is similar functionality provided upstream.
      8 
      9 diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_file.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_file.cpp
     10 index 79930d79425..cfb4f90c0d5 100644
     11 --- a/compiler-rt/lib/sanitizer_common/sanitizer_file.cpp
     12 +++ b/compiler-rt/lib/sanitizer_common/sanitizer_file.cpp
     13 @@ -20,6 +20,10 @@
     14 #include "sanitizer_common.h"
     15 #include "sanitizer_file.h"
     16 
     17 +#if SANITIZER_LINUX
     18 +#include "sanitizer_posix.h"
     19 +#endif
     20 +
     21 namespace __sanitizer {
     22 
     23 void CatastrophicErrorWrite(const char *buffer, uptr length) {
     24 @@ -194,6 +198,34 @@ char *FindPathToBinary(const char *name) {
     25     if (*end == '\0') break;
     26     beg = end + 1;
     27   }
     28 +
     29 +#if SANITIZER_LINUX
     30 +  // If we cannot find the requested binary in PATH, we should try to locate
     31 +  // it next to the binary, in case it is shipped with the build itself
     32 +  // (e.g. llvm-symbolizer shipped with sanitizer build to symbolize on client.
     33 +  if (internal_readlink("/proc/self/exe", buffer.data(), kMaxPathLength) < 0)
     34 +    return nullptr;
     35 +
     36 +  uptr buf_len = internal_strlen(buffer.data());
     37 +
     38 +  /* Avoid using dirname() here */
     39 +  while (buf_len > 0) {
     40 +    if (buffer[buf_len - 1] == '/')
     41 +      break;
     42 +    buf_len--;
     43 +  }
     44 +
     45 +  if (!buf_len)
     46 +    return nullptr;
     47 +
     48 +  if (buf_len + name_len + 1 <= kMaxPathLength) {
     49 +    internal_memcpy(&buffer[buf_len], name, name_len);
     50 +    buffer[buf_len + name_len] = '\0';
     51 +    if (FileExists(buffer.data()))
     52 +      return internal_strdup(buffer.data());
     53 +  }
     54 +#endif
     55 +
     56   return nullptr;
     57 }