From c710fb637ad921100b48b90c5c323efef0ddbe9b Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 21 Mar 2010 12:29:49 -0400 Subject: [PATCH] Backported fixes for bogus homedir bug to stable-2.0 branch. Fixes http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=553174 --- physfs.c | 24 ++++++++++-------------- platform/posix.c | 13 +++++++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/physfs.c b/physfs.c index 8b47a361..a0426036 100644 --- a/physfs.c +++ b/physfs.c @@ -605,18 +605,21 @@ static int freeDirHandle(DirHandle *dh, FileHandle *openList) static char *calculateUserDir(void) { - char *retval = NULL; - const char *str = NULL; + char *retval = __PHYSFS_platformGetUserDir(); + if (retval != NULL) + { + /* make sure it really exists and is normalized. */ + char *ptr = __PHYSFS_platformRealPath(retval); + allocator.Free(retval); + retval = ptr; + } /* if */ - str = __PHYSFS_platformGetUserDir(); - if (str != NULL) - retval = (char *) str; - else + if (retval == NULL) { const char *dirsep = PHYSFS_getDirSeparator(); const char *uname = __PHYSFS_platformGetUserName(); + const char *str = (uname != NULL) ? uname : "default"; - str = (uname != NULL) ? uname : "default"; retval = (char *) allocator.Malloc(strlen(baseDir) + strlen(str) + strlen(dirsep) + 6); @@ -754,13 +757,6 @@ int PHYSFS_init(const char *argv0) BAIL_IF_MACRO(!appendDirSep(&baseDir), NULL, 0); userDir = calculateUserDir(); - if (userDir != NULL) - { - ptr = __PHYSFS_platformRealPath(userDir); - allocator.Free(userDir); - userDir = ptr; - } /* if */ - if ((userDir == NULL) || (!appendDirSep(&userDir))) { allocator.Free(baseDir); diff --git a/platform/posix.c b/platform/posix.c index 2a933280..dd7a2099 100644 --- a/platform/posix.c +++ b/platform/posix.c @@ -97,8 +97,21 @@ char *__PHYSFS_platformGetUserName(void) char *__PHYSFS_platformGetUserDir(void) { char *retval = __PHYSFS_platformCopyEnvironmentVariable("HOME"); + + /* if the environment variable was set, make sure it's really a dir. */ + if (retval != NULL) + { + struct stat statbuf; + if ((stat(retval, &statbuf) == -1) || (S_ISDIR(statbuf.st_mode) == 0)) + { + allocator.Free(retval); + retval = NULL; + } /* if */ + } /* if */ + if (retval == NULL) retval = getUserDirByUID(); + return(retval); } /* __PHYSFS_platformGetUserDir */