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() {
|
std::string getProcessPath() {
|
||||||
|
#if defined(__FreeBSD__)
|
||||||
std::string ret("unknown");
|
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;
|
unsigned int n;
|
||||||
char buffer[PATH_MAX] = {};
|
char buffer[PATH_MAX] = {};
|
||||||
struct procstat* procstat = procstat_open_sysctl();
|
struct procstat* procstat = procstat_open_sysctl();
|
||||||
@ -367,20 +351,28 @@ std::string getProcessPath() {
|
|||||||
procstat_freeprocs(procstat, procs);
|
procstat_freeprocs(procstat, procs);
|
||||||
if (procstat)
|
if (procstat)
|
||||||
procstat_close(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);
|
const size_t idxLastSeparator = ret.find_last_of(EXV_SEPARATOR_CHR);
|
||||||
return ret.substr(0, idxLastSeparator);
|
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
|
} // namespace Exiv2
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user