Index: lldb/trunk/lit/Host/Inputs/simple.c =================================================================== --- lldb/trunk/lit/Host/Inputs/simple.c +++ lldb/trunk/lit/Host/Inputs/simple.c @@ -0,0 +1 @@ +int main(int argc, char const *argv[]) { return 0; } Index: lldb/trunk/lit/Host/TestCustomShell.test =================================================================== --- lldb/trunk/lit/Host/TestCustomShell.test +++ lldb/trunk/lit/Host/TestCustomShell.test @@ -0,0 +1,8 @@ +# 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-prefix ERROR +# RUN: env -i %lldb %t.out -b -o 'run' 2>&1 | FileCheck %s + +# ERROR: error: shell expansion failed +# CHECK-NOT: error: shell expansion failed Index: lldb/trunk/source/Host/posix/HostInfoPosix.cpp =================================================================== --- lldb/trunk/source/Host/posix/HostInfoPosix.cpp +++ lldb/trunk/source/Host/posix/HostInfoPosix.cpp @@ -52,15 +52,19 @@ }; } // namespace -llvm::Optional PosixUserIDResolver::DoGetUserName(id_t uid) { +struct PasswdEntry { + std::string username; + std::string shell; +}; + +static llvm::Optional GetPassword(id_t uid) { #ifdef USE_GETPWUID // getpwuid_r is missing from android-9 - // UserIDResolver provides some thread safety by making sure noone calls this - // function concurrently, but using getpwuid is ultimately not thread-safe as - // we don't know who else might be calling it. - struct passwd *user_info_ptr = ::getpwuid(uid); - if (user_info_ptr) - return std::string(user_info_ptr->pw_name); + // The caller should provide some thread safety by making sure no one calls + // this function concurrently, because using getpwuid is ultimately not + // thread-safe as we don't know who else might be calling it. + if (auto *user_info_ptr = ::getpwuid(uid)) + return PasswdEntry{user_info_ptr->pw_name, user_info_ptr->pw_shell}; #else struct passwd user_info; struct passwd *user_info_ptr = &user_info; @@ -69,12 +73,18 @@ if (::getpwuid_r(uid, &user_info, user_buffer, user_buffer_size, &user_info_ptr) == 0 && user_info_ptr) { - return std::string(user_info_ptr->pw_name); + return PasswdEntry{user_info_ptr->pw_name, user_info_ptr->pw_shell}; } #endif return llvm::None; } +llvm::Optional PosixUserIDResolver::DoGetUserName(id_t uid) { + if (llvm::Optional password = GetPassword(uid)) + return password->username; + return llvm::None; +} + llvm::Optional PosixUserIDResolver::DoGetGroupName(id_t gid) { #ifndef __ANDROID__ char group_buffer[PATH_MAX]; @@ -113,7 +123,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 (llvm::Optional password = GetPassword(::geteuid())) + return FileSpec(password->shell); + return FileSpec("/bin/sh"); +} bool HostInfoPosix::ComputeSupportExeDirectory(FileSpec &file_spec) { return ComputePathRelativeToLibrary(file_spec, "/bin");