diff options
author | Alvin Wong <alvin@alvinhc.com> | 2023-03-22 18:14:40 +0800 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2023-03-28 08:59:31 +0200 |
commit | 1ca4b5cfaa70c257772758cc188cf5a3a311b963 (patch) | |
tree | 435c38da9e4f543ba7a91c7ea287afeef986811a | |
parent | 973cea75544001fcb06a315b7190ce164793d9e7 (diff) |
[sanitizer][win] Change cmdline check to allow double backslashs
When `llvm-symbolizer.exe` is on the PATH in an entry containing two
consecutive backslashes, sanitizers will try to launch llvm-symbolizer
with its absolute path containing these consecutive backslashes. This
fails a sanity check in `sanitizer_symbolizer_win.cpp`.
According to the documentation of `CommandLineToArgvW` [1] and a MS blog
post [2], backslashes in general, regardless of how many of them in a
row, do not have any special effect, unless when immediately followed by
a double quote.
There already exists a check that fails when the command line arguments
contains double quote, therefore the check for double backslashes can
simply be removed.
[1]: https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw
[2]: https://learn.microsoft.com/en-us/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way
Differential Revision: https://reviews.llvm.org/D146621
(cherry picked from commit b1871ceb1cf6c6954380867d41db3812e9e0dbfc)
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_win.cpp | 2 | ||||
-rw-r--r-- | compiler-rt/test/asan/TestCases/Windows/report_after_syminitialize.cpp | 2 |
2 files changed, 1 insertions, 3 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_win.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_win.cpp index c647ab107ec5..ac2afe42e269 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_win.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_win.cpp @@ -231,8 +231,6 @@ bool SymbolizerProcess::StartSymbolizerSubprocess() { // Check that tool command lines are simple and that complete escaping is // unnecessary. CHECK(!internal_strchr(arg, '"') && "quotes in args unsupported"); - CHECK(!internal_strstr(arg, "\\\\") && - "double backslashes in args unsupported"); CHECK(arglen > 0 && arg[arglen - 1] != '\\' && "args ending in backslash and empty args unsupported"); command_line.append("\"%s\" ", arg); diff --git a/compiler-rt/test/asan/TestCases/Windows/report_after_syminitialize.cpp b/compiler-rt/test/asan/TestCases/Windows/report_after_syminitialize.cpp index c406152e9afa..81696630bd44 100644 --- a/compiler-rt/test/asan/TestCases/Windows/report_after_syminitialize.cpp +++ b/compiler-rt/test/asan/TestCases/Windows/report_after_syminitialize.cpp @@ -1,5 +1,5 @@ // RUN: %clangxx_asan -O0 %s -o %t -// RUN: %env_asan_opts=external_symbolizer_path=asdf not %run %t 2>&1 | FileCheck %s +// RUN: %env_asan_opts=external_symbolizer_path=non-existent\\\\asdf not %run %t 2>&1 | FileCheck %s #include <windows.h> #include <dbghelp.h> |