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)