From b319fb31d59ba436d9fc2d10482df77a9222378e Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 15 May 2011 17:18:46 +0000 Subject: (svn r22465) -Fix [FS#4613]: When determining the executable path failed, the working directory was used instead, circumventing the not-home-directory check. --- src/fileio.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'src') 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) -- cgit v1.2.3-54-g00ecf