forked from OSchip/llvm-project
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 llvm-svn: 364936
This commit is contained in:
parent
c3d5bbee23
commit
edf904efff
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue