diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2021-02-27 23:24:49 +0100 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2021-02-27 23:25:47 +0100 |
commit | 8397c66bf35af23a63673310e349495f0cb6ca35 (patch) | |
tree | 190f492ae72b036231e37592853e47e727381e11 /src/Common | |
parent | c6d63e9365a3c591e6451aeeb049c24de12649bf (diff) | |
download | VeraCrypt-8397c66bf35af23a63673310e349495f0cb6ca35.tar.gz VeraCrypt-8397c66bf35af23a63673310e349495f0cb6ca35.zip |
Windows: Load UrlUnescapeW dynamically from Shlwapi.dll and use safe URL opening starting from Vista only since security mechanism doesn't apply to Windows XP.
Diffstat (limited to 'src/Common')
-rw-r--r-- | src/Common/Dlgcode.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 8e1e0070..179ea217 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -22,13 +22,13 @@ #include <io.h> #include <math.h> #include <shlobj.h> +#include <shlwapi.h> #include <sys/stat.h> #include <stdlib.h> #include <time.h> #include <tchar.h> #include <Richedit.h> #if defined (TCMOUNT) || defined (VOLFORMAT) -#include <Shlwapi.h> #include <process.h> #include <Tlhelp32.h> #endif @@ -345,6 +345,13 @@ typedef LSTATUS (STDAPICALLTYPE *SHDeleteKeyWPtr)(HKEY hkey, LPCWSTR pszSubKey); typedef HRESULT (STDAPICALLTYPE *SHStrDupWPtr)(LPCWSTR psz, LPWSTR *ppwsz); +typedef HRESULT (STDAPICALLTYPE *UrlUnescapeWPtr)( + PWSTR pszUrl, + PWSTR pszUnescaped, + DWORD *pcchUnescaped, + DWORD dwFlags +); + // ChangeWindowMessageFilter typedef BOOL (WINAPI *ChangeWindowMessageFilterPtr) (UINT, DWORD); @@ -373,6 +380,7 @@ SetupInstallFromInfSectionWPtr SetupInstallFromInfSectionWFn = NULL; SetupOpenInfFileWPtr SetupOpenInfFileWFn = NULL; SHDeleteKeyWPtr SHDeleteKeyWFn = NULL; SHStrDupWPtr SHStrDupWFn = NULL; +UrlUnescapeWPtr UrlUnescapeWFn = NULL; ChangeWindowMessageFilterPtr ChangeWindowMessageFilterFn = NULL; CreateProcessWithTokenWFn CreateProcessWithTokenWPtr = NULL; @@ -3101,10 +3109,11 @@ void InitApp (HINSTANCE hInstance, wchar_t *lpszCommandLine) if (!SetupCloseInfFileFn || !SetupDiOpenClassRegKeyFn || !SetupInstallFromInfSectionWFn || !SetupOpenInfFileWFn) AbortProcess ("INIT_DLL"); - // Get SHDeleteKeyW function pointer + // Get SHDeleteKeyW,SHStrDupW, UrlUnescapeW functions pointers SHDeleteKeyWFn = (SHDeleteKeyWPtr) GetProcAddress (hShlwapiDll, "SHDeleteKeyW"); SHStrDupWFn = (SHStrDupWPtr) GetProcAddress (hShlwapiDll, "SHStrDupW"); - if (!SHDeleteKeyWFn || !SHStrDupWFn) + UrlUnescapeWFn = (UrlUnescapeWPtr) GetProcAddress(hShlwapiDll, "UrlUnescapeW"); + if (!SHDeleteKeyWFn || !SHStrDupWFn || !UrlUnescapeWFn) AbortProcess ("INIT_DLL"); if (IsOSAtLeast (WIN_VISTA)) @@ -11191,7 +11200,7 @@ void Applink (const char *dest) CorrectURL (url); } - if (IsAdmin ()) + if (IsOSAtLeast (WIN_VISTA) && IsAdmin ()) { int openDone = 0; if (buildUrl) @@ -11201,7 +11210,7 @@ void Applink (const char *dest) StringCbCopyW (pageFileName, sizeof(pageFileName), page); /* remove escape sequences from the page name before calling FileExists function */ - if (S_OK == UrlUnescapeW (pageFileName, pageFileName, &cchUnescaped, URL_UNESCAPE_INPLACE)) + if (S_OK == UrlUnescapeWFn (pageFileName, pageFileName, &cchUnescaped, URL_UNESCAPE_INPLACE)) { std::wstring pageFullPath = installDir; pageFullPath += L"docs\\html\\en\\"; |