JDevlieghere created this revision. JDevlieghere added reviewers: labath, jingham, friss.
LLDB handles shell expansion by running lldb-argdumper under a shell. Currently, this is always `/bin/sh` on POSIX. This potentially leads to different behavior between lldb and the user's current shell. Here's an example of different expansions between shells: $ /bin/bash -c 'echo -config={Options:[{key:foo_key,value:foo_value}]}' -config={Options:[key:foo_key]} -config={Options:[value:foo_value]} $ /bin/zsh -c 'echo -config={Options:[{key:foo_key,value:foo_value}]}' zsh:1: no matches found: -config={Options:[key:foo_key]} $ /bin/sh -c 'echo -config={Options:[{key:foo_key,value:foo_value}]}' -config={Options:[key:foo_key]} -config={Options:[value:foo_value]} $ /usr/local/bin/fish -c 'echo -config={Options:[{key:foo_key,value:foo_value}]}' -config=Options:[key:foo_key] -config=Options:[value:foo_value] To reduce surprises, this patch returns the user's current shell. It first looks at the `SHELL` environment variable. If that isn't set, it'll ask for the user's default shell. Only if that fails, we'll fallback to `/bin/sh`, which should always be available. https://reviews.llvm.org/D68316 Files: lldb/lit/Host/Inputs/simple.c lldb/lit/Host/TestCustomShell.test lldb/source/Host/posix/HostInfoPosix.cpp Index: lldb/source/Host/posix/HostInfoPosix.cpp =================================================================== --- lldb/source/Host/posix/HostInfoPosix.cpp +++ lldb/source/Host/posix/HostInfoPosix.cpp @@ -113,7 +113,13 @@ uint32_t HostInfoPosix::GetEffectiveGroupID() { return getegid(); } -FileSpec HostInfoPosix::GetDefaultShell() { return FileSpec("/bin/sh"); } +FileSpec HostInfoPosix::GetDefaultShell() { + if (const char *v = ::getenv("SHELL")) + return FileSpec(v); + if (const char *v = ::getpwuid(::geteuid())->pw_shell) + return FileSpec(v); + return FileSpec("/bin/sh"); +} bool HostInfoPosix::ComputeSupportExeDirectory(FileSpec &file_spec) { return ComputePathRelativeToLibrary(file_spec, "/bin"); Index: lldb/lit/Host/TestCustomShell.test =================================================================== --- /dev/null +++ lldb/lit/Host/TestCustomShell.test @@ -0,0 +1,5 @@ +# UNSUPPORTED: system-windows + +# RUN: %clang %S/Inputs/simple.c -g -o %t.out +# RUN: SHELL=bogus %lldb %t.out -b -o 'run' 2>&1 | FileCheck %s +# CHECK: error: shell expansion failed Index: lldb/lit/Host/Inputs/simple.c =================================================================== --- /dev/null +++ lldb/lit/Host/Inputs/simple.c @@ -0,0 +1 @@ +int main(int argc, char const *argv[]) { return 0; }
Index: lldb/source/Host/posix/HostInfoPosix.cpp =================================================================== --- lldb/source/Host/posix/HostInfoPosix.cpp +++ lldb/source/Host/posix/HostInfoPosix.cpp @@ -113,7 +113,13 @@ uint32_t HostInfoPosix::GetEffectiveGroupID() { return getegid(); } -FileSpec HostInfoPosix::GetDefaultShell() { return FileSpec("/bin/sh"); } +FileSpec HostInfoPosix::GetDefaultShell() { + if (const char *v = ::getenv("SHELL")) + return FileSpec(v); + if (const char *v = ::getpwuid(::geteuid())->pw_shell) + return FileSpec(v); + return FileSpec("/bin/sh"); +} bool HostInfoPosix::ComputeSupportExeDirectory(FileSpec &file_spec) { return ComputePathRelativeToLibrary(file_spec, "/bin"); Index: lldb/lit/Host/TestCustomShell.test =================================================================== --- /dev/null +++ lldb/lit/Host/TestCustomShell.test @@ -0,0 +1,5 @@ +# UNSUPPORTED: system-windows + +# RUN: %clang %S/Inputs/simple.c -g -o %t.out +# RUN: SHELL=bogus %lldb %t.out -b -o 'run' 2>&1 | FileCheck %s +# CHECK: error: shell expansion failed Index: lldb/lit/Host/Inputs/simple.c =================================================================== --- /dev/null +++ lldb/lit/Host/Inputs/simple.c @@ -0,0 +1 @@ +int main(int argc, char const *argv[]) { return 0; }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits