diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2012-02-26 17:07:32 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2012-02-26 17:11:38 +0100 |
commit | 21ae37d215e4384369d8757def895f2b31426807 (patch) | |
tree | 658360bf2ad79ec70bd8868a3983d150c2fcde35 | |
parent | da9ab62fb7cfa3fa36eb81ce2503685a45c5d346 (diff) |
Simplify MyGetSpecialFolderPath and fix possible buffer overflow (#901)
-rw-r--r-- | src/util.cpp | 43 |
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 |