VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2021-02-27 23:24:49 +0100
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2021-02-27 23:25:47 +0100
commit8397c66bf35af23a63673310e349495f0cb6ca35 (patch)
tree190f492ae72b036231e37592853e47e727381e11
parentc6d63e9365a3c591e6451aeeb049c24de12649bf (diff)
downloadVeraCrypt-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.
-rw-r--r--src/Common/Dlgcode.c19
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\\";