From 930cc2cfb0a3d83128bdaaede1cd0be4a6976205 Mon Sep 17 00:00:00 2001 From: Cody Northrop Date: Wed, 14 Jun 2017 14:15:39 -0600 Subject: [PATCH] posix: Don't modify env while getting app path This code was inadvertently changing the working environment of applications that called it. Hasn't been a problem until we started calling scripts which need PATH to remain good. --- renderdoc/os/posix/posix_process.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/renderdoc/os/posix/posix_process.cpp b/renderdoc/os/posix/posix_process.cpp index 1061200ed..1f848f5bc 100644 --- a/renderdoc/os/posix/posix_process.cpp +++ b/renderdoc/os/posix/posix_process.cpp @@ -41,6 +41,8 @@ int GetIdentPort(pid_t childPid); static const string GetAbsoluteAppPathFromName(const string &appName) { + string appPath; + // If the application name contains a slash character convert it to an absolute path and return it if(appName.find("/") != string::npos) { @@ -48,7 +50,7 @@ static const string GetAbsoluteAppPathFromName(const string &appName) string appDir = dirname(appName); string appBasename = basename(appName); realpath(appDir.c_str(), realpathBuffer); - string appPath(realpathBuffer); + appPath = realpathBuffer; appPath += "/" + appBasename; return appPath; } @@ -57,19 +59,28 @@ static const string GetAbsoluteAppPathFromName(const string &appName) // Return "" if no exectuable found in the PATH list char *pathEnvVar = getenv("PATH"); if(!pathEnvVar) - return string(); + return appPath; + + // Make a copy of our PATH so strtok can insert NULL without actually changing env + char *localPath = new char[strlen(pathEnvVar) + 1]; + strcpy(localPath, pathEnvVar); const char *pathSeparator = ":"; - const char *path = strtok(pathEnvVar, pathSeparator); + const char *path = strtok(localPath, pathSeparator); while(path) { string testPath(path); testPath += "/" + appName; if(!access(testPath.c_str(), X_OK)) - return testPath; + { + appPath = testPath; + break; + } path = strtok(NULL, pathSeparator); } - return string(); + + delete[] localPath; + return appPath; } static vector &GetEnvModifications()