diff options
author | frosch <frosch@openttd.org> | 2011-05-15 17:18:46 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2011-05-15 17:18:46 +0000 |
commit | b319fb31d59ba436d9fc2d10482df77a9222378e (patch) | |
tree | a47b660e03f5b900b2ae97c1556c67c1c420cad5 | |
parent | 003dee6e382369eb506adae74c61a9109d400563 (diff) | |
download | openttd-b319fb31d59ba436d9fc2d10482df77a9222378e.tar.xz |
(svn r22465) -Fix [FS#4613]: When determining the executable path failed, the working directory was used instead, circumventing the not-home-directory check.
-rw-r--r-- | src/fileio.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/fileio.cpp b/src/fileio.cpp index 8ecf8138c..78e946d23 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -867,8 +867,9 @@ extern void DetermineBasePaths(const char *exe); * in the same way we remove the name from the executable name. * @param exe the path to the executable */ -void ChangeWorkingDirectory(const char *exe) +static bool ChangeWorkingDirectoryToExecutable(const char *exe) { + bool success = false; #ifdef WITH_COCOA char *app_bundle = strchr(exe, '.'); while (app_bundle != NULL && strncasecmp(app_bundle, ".app", 4) != 0) app_bundle = strchr(&app_bundle[1], '.'); @@ -882,12 +883,17 @@ void ChangeWorkingDirectory(const char *exe) /* If we want to go to the root, we can't use cd C:, but we must use '/' */ if (s[-1] == ':') chdir("/"); #endif - if (chdir(exe) != 0) DEBUG(misc, 0, "Directory with the binary does not exist?"); + if (chdir(exe) != 0) { + DEBUG(misc, 0, "Directory with the binary does not exist?"); + } else { + success = true; + } *s = PATHSEPCHAR; } #ifdef WITH_COCOA if (app_bundle != NULL) app_bundle[0] = '.'; #endif /* WITH_COCOA */ + return success; } /** @@ -965,14 +971,19 @@ void DetermineBasePaths(const char *exe) _do_scan_working_directory = DoScanWorkingDirectory(); /* Change the working directory to that one of the executable */ - ChangeWorkingDirectory(exe); - if (getcwd(tmp, MAX_PATH) == NULL) *tmp = '\0'; - AppendPathSeparator(tmp, MAX_PATH); - _searchpaths[SP_BINARY_DIR] = strdup(tmp); + if (ChangeWorkingDirectoryToExecutable(exe)) { + if (getcwd(tmp, MAX_PATH) == NULL) *tmp = '\0'; + AppendPathSeparator(tmp, MAX_PATH); + _searchpaths[SP_BINARY_DIR] = strdup(tmp); + } else { + _searchpaths[SP_BINARY_DIR] = NULL; + } if (_searchpaths[SP_WORKING_DIR] != NULL) { /* Go back to the current working directory. */ - ChangeWorkingDirectory(_searchpaths[SP_WORKING_DIR]); + if (chdir(_searchpaths[SP_WORKING_DIR]) != 0) { + DEBUG(misc, 0, "Failed to return to working directory!"); + } } #if defined(__MORPHOS__) || defined(__AMIGA__) || defined(DOS) || defined(OS2) |