diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc --- a/llvm/lib/Support/Unix/Path.inc +++ b/llvm/lib/Support/Unix/Path.inc @@ -676,11 +676,17 @@ // This is a string of the form ~username/, look up this user's entry in the // password database. - struct passwd *Entry = nullptr; + std::unique_ptr Buf; + long BufSize = sysconf(_SC_GETPW_R_SIZE_MAX); + if (BufSize <= 0) + BufSize = 16384; + Buf = std::make_unique(BufSize); + struct passwd Pwd; std::string User = Expr.str(); - Entry = ::getpwnam(User.c_str()); + struct passwd *Entry = nullptr; + getpwnam_r(User.c_str(), &Pwd, Buf.get(), BufSize, &Entry); - if (!Entry) { + if (!Entry || !Entry->pw_dir) { // Unable to look up the entry, just return back the original path. return; } @@ -1339,9 +1345,16 @@ namespace path { bool home_directory(SmallVectorImpl &result) { + std::unique_ptr Buf; char *RequestedDir = getenv("HOME"); if (!RequestedDir) { - struct passwd *pw = getpwuid(getuid()); + long BufSize = sysconf(_SC_GETPW_R_SIZE_MAX); + if (BufSize <= 0) + BufSize = 16384; + Buf = std::make_unique(BufSize); + struct passwd Pwd; + struct passwd *pw = nullptr; + getpwuid_r(getuid(), &Pwd, Buf.get(), BufSize, &pw); if (pw && pw->pw_dir) RequestedDir = pw->pw_dir; }