VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/Platform')
-rw-r--r--src/Platform/Unix/Process.cpp63
-rw-r--r--src/Platform/Unix/Process.h2
2 files changed, 64 insertions, 1 deletions
diff --git a/src/Platform/Unix/Process.cpp b/src/Platform/Unix/Process.cpp
index 45106918..0c2a9c59 100644
--- a/src/Platform/Unix/Process.cpp
+++ b/src/Platform/Unix/Process.cpp
@@ -27,12 +27,73 @@
namespace VeraCrypt
{
- string Process::Execute (const string &processName, const list <string> &arguments, int timeOut, ProcessExecFunctor *execFunctor, const Buffer *inputData)
+
+ bool Process::IsExecutable(const std::string& path) {
+ struct stat sb;
+ if (stat(path.c_str(), &sb) == 0) {
+ return S_ISREG(sb.st_mode) && (sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH));
+ }
+ return false;
+ }
+
+ // Find executable in system paths
+ std::string Process::FindSystemBinary(const char* name, std::string& errorMsg) {
+ if (!name) {
+ errno = EINVAL; // Invalid argument
+ errorMsg = "Invalid input: name or paths is NULL";
+ return "";
+ }
+
+ // Default system directories to search for executables
+#ifdef TC_MACOSX
+ const char* defaultDirs[] = {"/usr/local/bin", "/usr/bin", "/bin", "/user/sbin", "/sbin"};
+#elseif TC_FREEBSD
+ const char* defaultDirs[] = {"/sbin", "/bin", "/usr/sbin", "/usr/bin", "/usr/local/sbin", "/usr/local/bin"};
+#elseif TC_OPENBSD
+ const char* defaultDirs[] = {"/sbin", "/bin", "/usr/sbin", "/usr/bin", "/usr/X11R6/bin", "/usr/local/sbin", "/usr/local/bin"};
+#else
+ const char* defaultDirs[] = {"/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin"};
+#endif
+ const size_t defaultDirCount = sizeof(defaultDirs) / sizeof(defaultDirs[0]);
+
+ std::string currentPath(name);
+
+ // If path doesn't start with '/', prepend default directories
+ if (currentPath[0] != '/') {
+ for (size_t i = 0; i < defaultDirCount; ++i) {
+ std::string combinedPath = std::string(defaultDirs[i]) + "/" + currentPath;
+ if (IsExecutable(combinedPath)) {
+ return combinedPath;
+ }
+ }
+ } else if (IsExecutable(currentPath)) {
+ return currentPath;
+ }
+
+ // Prepare error message
+ errno = ENOENT; // No such file or directory
+ errorMsg = std::string(name) + " not found in system directories";
+ return "";
+ }
+
+ string Process::Execute (const string &processNameArg, const list <string> &arguments, int timeOut, ProcessExecFunctor *execFunctor, const Buffer *inputData)
{
char *args[32];
if (array_capacity (args) <= (arguments.size() + 1))
throw ParameterTooLarge (SRC_POS);
+ // if execFunctor is null and processName is not absolute path, find it in system paths
+ string processName;
+ if (!execFunctor && (processNameArg[0] != '/'))
+ {
+ std::string errorMsg;
+ processName = FindSystemBinary(processNameArg.c_str(), errorMsg);
+ if (processName.empty())
+ throw SystemException(SRC_POS, errorMsg);
+ }
+ else
+ processName = processNameArg;
+
#if 0
stringstream dbg;
dbg << "exec " << processName;
diff --git a/src/Platform/Unix/Process.h b/src/Platform/Unix/Process.h
index a796ed6a..83215956 100644
--- a/src/Platform/Unix/Process.h
+++ b/src/Platform/Unix/Process.h
@@ -31,6 +31,8 @@ namespace VeraCrypt
Process ();
virtual ~Process ();
+ static bool IsExecutable(const std::string& path);
+ static std::string FindSystemBinary(const char* name, std::string& errorMsg);
static string Execute (const string &processName, const list <string> &arguments, int timeOut = -1, ProcessExecFunctor *execFunctor = nullptr, const Buffer *inputData = nullptr);
protected: