Author: Raphael Isemann Date: 2022-07-11T16:44:46-07:00 New Revision: 9bc34636a50ffd9d417d30af021798b6294a1725
URL: https://github.com/llvm/llvm-project/commit/9bc34636a50ffd9d417d30af021798b6294a1725 DIFF: https://github.com/llvm/llvm-project/commit/9bc34636a50ffd9d417d30af021798b6294a1725.diff LOG: [lldb] Add support for escaping fish arguments LLDB supports having globbing regexes in the process launch arguments that will be resolved using the user's shell. This requires that we pass the launch args to the shell and then read back the expanded arguments using LLDB's argdumper utility. As the shell will not just expand the globbing regexes but all special characters, we need to escape all non-globbing charcters such as $, &, <, >, etc. as those otherwise are interpreted and removed in the step where we expand the globbing characters. Also because the special characters are shell-specific, LLDB needs to maintain a list of all the characters that need to be escaped for each specific shell. This patch adds the list of special characters that need to be escaped for fish. Without this patch on systems where fish is the user's shell having any of these special characters in your arguments or path to the binary will cause the process launch to fail. E.g., `lldb -- ./calc 1<2` is failing without this patch. The same happens if the absolute path to calc is in a directory that contains for example parentheses or other special characters. Differential revision: https://reviews.llvm.org/D104635 Added: Modified: lldb/source/Utility/Args.cpp lldb/unittests/Utility/ArgsTest.cpp Removed: ################################################################################ diff --git a/lldb/source/Utility/Args.cpp b/lldb/source/Utility/Args.cpp index 3978f94226530..daccb91d84360 100644 --- a/lldb/source/Utility/Args.cpp +++ b/lldb/source/Utility/Args.cpp @@ -385,6 +385,7 @@ std::string Args::GetShellSafeArgument(const FileSpec &shell, }; static ShellDescriptor g_Shells[] = {{ConstString("bash"), " '\"<>()&;"}, + {ConstString("fish"), " '\"<>()&\\|;"}, {ConstString("tcsh"), " '\"<>()&;"}, {ConstString("zsh"), " '\"<>()&;\\|"}, {ConstString("sh"), " '\"<>()&;"}}; diff --git a/lldb/unittests/Utility/ArgsTest.cpp b/lldb/unittests/Utility/ArgsTest.cpp index 755a110aa555f..bc6a3d2c16e41 100644 --- a/lldb/unittests/Utility/ArgsTest.cpp +++ b/lldb/unittests/Utility/ArgsTest.cpp @@ -348,6 +348,13 @@ TEST(ArgsTest, GetShellSafeArgument) { // Normal characters and globbing expressions that shouldn't be escaped. EXPECT_EQ(Args::GetShellSafeArgument(sh, "aA$1*"), "aA$1*"); + // Test escaping fish special characters. + FileSpec fish("/bin/fish", FileSpec::Style::posix); + EXPECT_EQ(Args::GetShellSafeArgument(fish, R"( '"<>()&\|;)"), + R"(\ \'\"\<\>\(\)\&\\\|\;)"); + // Normal characters and expressions that shouldn't be escaped. + EXPECT_EQ(Args::GetShellSafeArgument(fish, "aA$1*"), "aA$1*"); + // Try escaping with an unknown shell. FileSpec unknown_shell("/bin/unknown_shell", FileSpec::Style::posix); EXPECT_EQ(Args::GetShellSafeArgument(unknown_shell, "a'b"), "a\\'b"); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits