aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2012-02-26 17:07:32 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2012-02-26 17:11:38 +0100
commit21ae37d215e4384369d8757def895f2b31426807 (patch)
tree658360bf2ad79ec70bd8868a3983d150c2fcde35
parentda9ab62fb7cfa3fa36eb81ce2503685a45c5d346 (diff)
Simplify MyGetSpecialFolderPath and fix possible buffer overflow (#901)
-rw-r--r--src/util.cpp43
1 files changed, 10 insertions, 33 deletions
diff --git a/src/util.cpp b/src/util.cpp
index f1af91de27..41a4ac1a07 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -787,46 +787,23 @@ void PrintExceptionContinue(std::exception* pex, const char* pszThread)
strMiscWarning = pszMessage;
}
-
-
-
-
-
-
-
#ifdef WIN32
-typedef WINSHELLAPI BOOL (WINAPI *PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate);
-
string MyGetSpecialFolderPath(int nFolder, bool fCreate)
{
- char pszPath[MAX_PATH+100] = "";
-
- // SHGetSpecialFolderPath isn't always available on old Windows versions
- HMODULE hShell32 = LoadLibraryA("shell32.dll");
- if (hShell32)
+ char pszPath[MAX_PATH] = "";
+ if(SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate))
{
- PSHGETSPECIALFOLDERPATHA pSHGetSpecialFolderPath =
- (PSHGETSPECIALFOLDERPATHA)GetProcAddress(hShell32, "SHGetSpecialFolderPathA");
- if (pSHGetSpecialFolderPath)
- (*pSHGetSpecialFolderPath)(NULL, pszPath, nFolder, fCreate);
- FreeModule(hShell32);
+ return pszPath;
}
-
- // Backup option
- if (pszPath[0] == '\0')
+ else if (nFolder == CSIDL_STARTUP)
{
- if (nFolder == CSIDL_STARTUP)
- {
- strcpy(pszPath, getenv("USERPROFILE"));
- strcat(pszPath, "\\Start Menu\\Programs\\Startup");
- }
- else if (nFolder == CSIDL_APPDATA)
- {
- strcpy(pszPath, getenv("APPDATA"));
- }
+ return string(getenv("USERPROFILE")) + "\\Start Menu\\Programs\\Startup";
}
-
- return pszPath;
+ else if (nFolder == CSIDL_APPDATA)
+ {
+ return getenv("APPDATA");
+ }
+ return "";
}
#endif