# HG changeset patch # User reimar # Date 1338659941 0 # Node ID 9f5d0eade1bd714ad2a90433360e27157a5f15d6 # Parent 139743f7e0850e078103b1b44bccec62c3da4372 Reduce code duplication in get_path. Also avoid using a pointer to an on-stack array outside the array's scope, a compiler might use its stack area for other variables or it might optimize away all code modifying it right before it leaves the scope, thus completely breaking the code. diff -r 139743f7e085 -r 9f5d0eade1bd path.c --- a/path.c Sat Jun 02 17:54:41 2012 +0000 +++ b/path.c Sat Jun 02 17:59:01 2012 +0000 @@ -45,6 +45,8 @@ #include "osdep/osdep.h" char *get_path(const char *filename){ + // temporary buffer that will be freed + char *tmp = 0; char *homedir; char *buff; #ifdef __MINGW32__ @@ -65,40 +67,33 @@ if ((homedir = getenv("MPLAYER_HOME")) != NULL) config_dir = ""; else if ((homedir = getenv("HOME")) == NULL) -#if defined(__MINGW32__) || defined(__CYGWIN__) - /* Hack to get fonts etc. loaded outside of Cygwin environment. */ { - int i,imax=0; - char exedir[260]; - GetModuleFileNameA(NULL, exedir, 260); - for (i=0; i< strlen(exedir); i++) - if (exedir[i] =='\\') - {exedir[i]='/'; imax=i;} - exedir[imax]='\0'; - homedir = exedir; +#if !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__OS2__) + return NULL; +#else + int i; + char path[260]; +#ifdef __OS2__ + PPIB ppib; + // Get process info blocks + DosGetInfoBlocks(NULL, &ppib); + // Get full path of the executable + DosQueryModuleName(ppib->pib_hmte, sizeof( path ), path); +#else + GetModuleFileNameA(NULL, path, 260); +#endif + // Extract directory part + tmp = homedir = mp_dirname(path); + // Convert backslashes to slashes + for (i = 0; homedir[i]; i++) + if (homedir[i] == '\\') homedir[i] = '/'; + // If there is a trailing slash remove it. + // If there isn't, remove the one from config dir (if homedir + // ends up e.g. c:) + if (i && homedir[i-1] == '/') homedir[i-1] = 0; + else config_dir++; +#endif } -#elif defined(__OS2__) - { - PPIB ppib; - char path[260]; - - // Get process info blocks - DosGetInfoBlocks(NULL, &ppib); - - // Get full path of the executable - DosQueryModuleName(ppib->pib_hmte, sizeof( path ), path); - - // Truncate name part including last backslash - *strrchr(path, '\\') = 0; - - // Convert backslash to slash - _fnslashify(path); - - homedir = path; - } -#else - return NULL; -#endif len = strlen(homedir) + strlen(config_dir) + 1; if (filename == NULL) { if ((buff = malloc(len)) == NULL) @@ -151,6 +146,7 @@ } } #endif + free(tmp); mp_msg(MSGT_GLOBAL,MSGL_V,"get_path('%s') -> '%s'\n",filename,buff); return buff; }