Mercurial > hg > openttd
changeset 17688:18cbda268559 draft
(svn r22465) -Fix [FS#4613]: When determining the executable path failed, the working directory was used instead, circumventing the not-home-directory check.
author | frosch <frosch@openttd.org> |
---|---|
date | Sun, 15 May 2011 17:18:46 +0000 |
parents | b1762882d6c9 |
children | 1842862b5d4e |
files | src/fileio.cpp |
diffstat | 1 files changed, 18 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -867,8 +867,9 @@ * 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 @@ /* 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 @@ _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)