don't assign an fs::path to a string
Seems to trip up MemorySanitizer on ARM32. Also applied various simplifications to the code using std::filesystem Signed-off-by: Rosen Penev <rosenp@gmail.com>
This commit is contained in:
parent
5ccb525dd3
commit
01aab49f6f
@ -336,24 +336,8 @@ Uri Uri::Parse(const std::string& uri) {
|
||||
}
|
||||
|
||||
std::string getProcessPath() {
|
||||
#if defined(__FreeBSD__)
|
||||
std::string ret("unknown");
|
||||
#if defined(_WIN32)
|
||||
HANDLE processHandle = nullptr;
|
||||
processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
|
||||
if (processHandle) {
|
||||
TCHAR filename[MAX_PATH];
|
||||
if (GetModuleFileNameEx(processHandle, nullptr, filename, MAX_PATH) != 0) {
|
||||
ret = filename;
|
||||
}
|
||||
CloseHandle(processHandle);
|
||||
}
|
||||
#elif __has_include(<libproc.h>)
|
||||
const int pid = getpid();
|
||||
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
||||
if (proc_pidpath(pid, pathbuf, sizeof(pathbuf)) > 0) {
|
||||
ret = pathbuf;
|
||||
}
|
||||
#elif defined(__FreeBSD__)
|
||||
unsigned int n;
|
||||
char buffer[PATH_MAX] = {};
|
||||
struct procstat* procstat = procstat_open_sysctl();
|
||||
@ -367,20 +351,28 @@ std::string getProcessPath() {
|
||||
procstat_freeprocs(procstat, procs);
|
||||
if (procstat)
|
||||
procstat_close(procstat);
|
||||
#elif defined(__sun__)
|
||||
// https://stackoverflow.com/questions/47472762/on-solaris-how-to-get-the-full-path-of-executable-of-running-process-programatic
|
||||
const char* proc = Internal::stringFormat("/proc/%d/path/a.out", getpid()).c_str();
|
||||
char path[500];
|
||||
ssize_t l = readlink(proc, path, sizeof(path) - 1);
|
||||
if (l > 0) {
|
||||
path[l] = 0;
|
||||
ret = path;
|
||||
}
|
||||
#elif defined(__unix__)
|
||||
ret = fs::read_symlink("/proc/self/exe");
|
||||
#endif
|
||||
|
||||
const size_t idxLastSeparator = ret.find_last_of(EXV_SEPARATOR_CHR);
|
||||
return ret.substr(0, idxLastSeparator);
|
||||
#else
|
||||
try {
|
||||
#if defined(_WIN32)
|
||||
TCHAR pathbuf[MAX_PATH];
|
||||
GetModuleFileName(nullptr, pathbuf, MAX_PATH);
|
||||
auto path = fs::path(pathbuf);
|
||||
#elif __has_include(<libproc.h>)
|
||||
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
||||
proc_pidpath(getpid(), pathbuf, sizeof(pathbuf));
|
||||
auto path = fs::path(pathbuf);
|
||||
#elif defined(__sun__)
|
||||
auto path = fs::read_symlink(Internal::stringFormat("/proc/%d/path/a.out", getpid()));
|
||||
#elif defined(__unix__)
|
||||
auto path = fs::read_symlink("/proc/self/exe");
|
||||
#endif
|
||||
return path.parent_path().string();
|
||||
} catch (const fs::filesystem_error&) {
|
||||
return "unknown";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} // namespace Exiv2
|
||||
|
||||
Loading…
Reference in New Issue
Block a user