From 355541a1b7a5011f8f4ebadc3e23b25c734f9d27 Mon Sep 17 00:00:00 2001 From: Raphael Isemann Date: Mon, 28 Jun 2021 18:58:42 +0200 Subject: [PATCH] [lldb] Avoid using any shell when calling xcrun. When we run `xcrun` we don't have any user input in our command so relying on the user's default shell doesn't make a lot of sense. If the user has set the system shell to a something that isn't supported yet (dash, ash) then we would run into the problem that we don't know how to escape our command string. This patch just avoids using any shell at all as xcrun is always at the same path. Reviewed By: aprantl, JDevlieghere, kastiglione Differential Revision: https://reviews.llvm.org/D104653 --- .../source/Host/macosx/objcxx/HostInfoMacOSX.mm | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm index f822533f1b41..a0706ec9ff6a 100644 --- a/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm +++ b/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm @@ -383,17 +383,22 @@ static std::string GetXcodeSDK(XcodeSDK sdk) { auto xcrun = [](const std::string &sdk, llvm::StringRef developer_dir = "") -> std::string { - std::string xcrun_cmd = "xcrun --show-sdk-path --sdk " + sdk; - if (!developer_dir.empty()) - xcrun_cmd = "/usr/bin/env DEVELOPER_DIR=\"" + developer_dir.str() + - "\" " + xcrun_cmd; + Args args; + if (!developer_dir.empty()) { + args.AppendArgument("/usr/bin/env"); + args.AppendArgument("DEVELOPER_DIR=" + developer_dir.str()); + } + args.AppendArgument("/usr/bin/xcrun"); + args.AppendArgument("--show-sdk-path"); + args.AppendArgument("--sdk"); + args.AppendArgument(sdk); int status = 0; int signo = 0; std::string output_str; lldb_private::Status error = - Host::RunShellCommand(xcrun_cmd, FileSpec(), &status, &signo, - &output_str, std::chrono::seconds(15)); + Host::RunShellCommand(args, FileSpec(), &status, &signo, &output_str, + std::chrono::seconds(15)); // Check that xcrun return something useful. if (status != 0 || output_str.empty())