From: Sam McCall Date: Tue, 2 Jul 2019 15:42:37 +0000 (+0000) Subject: getMainExecutable: handle realpath() failure, falling back to getprogpath(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=df7c6428b2ae295aacf7d057e4a7b9250dc94e48;p=llvm getMainExecutable: handle realpath() failure, falling back to getprogpath(). Summary: Previously, we'd pass a nullptr to std::string and crash(). This case happens when the binary is deleted while being used (e.g. rebuilding clangd). Reviewers: kadircet Subscribers: ilya-biryukov, kristina, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D64068 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364936 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc index 761d183e91b..c64c0df19ad 100644 --- a/lib/Support/Unix/Path.inc +++ b/lib/Support/Unix/Path.inc @@ -222,20 +222,20 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) { // the program, and not the eventual binary file. Therefore, call realpath // so this behaves the same on all platforms. #if _POSIX_VERSION >= 200112 || defined(__GLIBC__) - char *real_path = realpath(exe_path, NULL); - std::string ret = std::string(real_path); - free(real_path); - return ret; + if (char *real_path = realpath(exe_path, NULL)) { + std::string ret = std::string(real_path); + free(real_path); + return ret; + } #else char real_path[MAXPATHLEN]; - realpath(exe_path, real_path); - return std::string(real_path); + if (realpath(exe_path, real_path)) + return std::string(real_path); #endif - } else { - // Fall back to the classical detection. - if (getprogpath(exe_path, argv0)) - return exe_path; } + // Fall back to the classical detection. + if (getprogpath(exe_path, argv0)) + return exe_path; #elif defined(HAVE_DLFCN_H) && defined(HAVE_DLADDR) // Use dladdr to get executable path if available. Dl_info DLInfo;