From d2ffba07bb747deaaae2fc58b3c71328a362d928 Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 25 Nov 2013 21:50:54 +0000 Subject: (svn r26114) -Fix-ish: do our best to not get bit by getenv being unsafe as hell --- src/fileio.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/fileio.cpp b/src/fileio.cpp index 8ce1d72a6..f88d8deea 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -1097,20 +1097,33 @@ void DetermineBasePaths(const char *exe) #ifdef __HAIKU__ BPath path; find_directory(B_USER_SETTINGS_DIRECTORY, &path); - const char *homedir = path.Path(); + const char *homedir = strdup(path.Path()); #else + /* getenv is highly unsafe; duplicate it as soon as possible, + * or at least before something else touches the environment + * variables in any way. It can also contain all kinds of + * unvalidated data we rather not want internally. */ const char *homedir = getenv("HOME"); + if (homedir != NULL) { + homedir = strndup(homedir, MAX_PATH); + } if (homedir == NULL) { const struct passwd *pw = getpwuid(getuid()); - homedir = (pw == NULL) ? "" : pw->pw_dir; + homedir = (pw == NULL) ? NULL : strdup(pw->pw_dir); } #endif - snprintf(tmp, MAX_PATH, "%s" PATHSEP "%s", homedir, PERSONAL_DIR); - AppendPathSeparator(tmp, MAX_PATH); + if (homedir != NULL) { + ValidateString(homedir); + snprintf(tmp, MAX_PATH, "%s" PATHSEP "%s", homedir, PERSONAL_DIR); + AppendPathSeparator(tmp, MAX_PATH); - _searchpaths[SP_PERSONAL_DIR] = strdup(tmp); + _searchpaths[SP_PERSONAL_DIR] = strdup(tmp); + free(homedir); + } else { + _searchpaths[SP_PERSONAL_DIR] = NULL; + } #endif #if defined(WITH_SHARED_DIR) -- cgit v1.2.3-54-g00ecf