diff --git a/lldb/source/Utility/Args.cpp b/lldb/source/Utility/Args.cpp index 60d0790c9d295f..505eff2f8e1374 100644 --- a/lldb/source/Utility/Args.cpp +++ b/lldb/source/Utility/Args.cpp @@ -386,6 +386,7 @@ std::string Args::GetShellSafeArgument(const FileSpec &shell, static ShellDescriptor g_Shells[] = {{ConstString("bash"), " '\"<>()&"}, {ConstString("tcsh"), " '\"<>()&$"}, + {ConstString("zsh"), " '\"<>()&;\\|"}, {ConstString("sh"), " '\"<>()&"}}; // safe minimal set diff --git a/lldb/unittests/Utility/ArgsTest.cpp b/lldb/unittests/Utility/ArgsTest.cpp index cd62c08df31e45..0b153a8d5936a5 100644 --- a/lldb/unittests/Utility/ArgsTest.cpp +++ b/lldb/unittests/Utility/ArgsTest.cpp @@ -322,6 +322,12 @@ TEST(ArgsTest, GetShellSafeArgument) { EXPECT_EQ(Args::GetShellSafeArgument(bash, "a\""), "a\\\""); EXPECT_EQ(Args::GetShellSafeArgument(bash, "a\"b"), "a\\\"b"); + FileSpec zsh("/bin/zsh", FileSpec::Style::posix); + EXPECT_EQ(Args::GetShellSafeArgument(zsh, R"('";()<>&|\)"), + R"(\'\"\;\(\)\<\>\&\|\\)"); + // Normal characters and expressions that shouldn't be escaped. + EXPECT_EQ(Args::GetShellSafeArgument(zsh, "aA$1*"), "aA$1*"); + // String that doesn't need to be escaped EXPECT_EQ(Args::GetShellSafeArgument(bash, "a"), "a");