From ce76957a10070c132a8adfbe2e7d3f12395b4caa Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Tue, 16 Aug 2016 04:04:31 +0200 Subject: [PATCH] Windows: Fix various issues detected by static analysis. --- src/Common/BootEncryption.cpp | 9 ++++++--- src/Common/XZip.cpp | 2 +- src/Crypto/GostCipher.c | 26 +++++++++++++------------- src/Crypto/GostCipher.h | 6 +++--- src/Crypto/Streebog.c | 4 ++-- src/Crypto/cpu.c | 2 +- src/Format/Tcformat.c | 16 +++++++++------- src/Mount/Mount.c | 2 ++ 8 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/Common/BootEncryption.cpp b/src/Common/BootEncryption.cpp index 3b799d04..984402dc 100644 --- a/src/Common/BootEncryption.cpp +++ b/src/Common/BootEncryption.cpp @@ -198,6 +198,9 @@ namespace VeraCrypt if (bstr) { CComBSTR inputBstr; + CComBSTR fileBstr; + fileBstr.Attach (bstr); + if (input && inputBstr.AppendBytes ((const char *) input, inputSize) != S_OK) { SetLastError (ERROR_INVALID_PARAMETER); @@ -211,8 +214,6 @@ namespace VeraCrypt return FALSE; } - CComBSTR fileBstr; - fileBstr.Attach (bstr); result = ElevatedComInstance->DeviceIoControl (readOnly, device, fileBstr, dwIoControlCode, inputBstr, &outputBstr); if (output) @@ -2071,6 +2072,8 @@ namespace VeraCrypt EfiBoot::EfiBoot() { ZeroMemory(EfiBootPartPath, sizeof(EfiBootPartPath)); ZeroMemory (systemPartitionPath, sizeof (systemPartitionPath)); + ZeroMemory (&sdn, sizeof (sdn)); + ZeroMemory (&partInfo, sizeof (partInfo)); m_bMounted = false; } @@ -2288,7 +2291,7 @@ namespace VeraCrypt wchar_t varName[256]; StringCchPrintfW(varName, ARRAYSIZE (varName), L"%s%04X", type == NULL ? L"Boot" : type, statrtOrderNum); SetFirmwareEnvironmentVariable(varName, EfiVarGuid, startVar, varSize); - delete startVar; + delete [] startVar; // Update order wstring order = L"Order"; diff --git a/src/Common/XZip.cpp b/src/Common/XZip.cpp index 9ce6de5d..be6d27ef 100644 --- a/src/Common/XZip.cpp +++ b/src/Common/XZip.cpp @@ -686,7 +686,7 @@ typedef struct zlist { char iname[MAX_PATH]; // Internal file name after cleanup char zname[MAX_PATH]; // External version of internal name int mark; // Marker for files to operate on - int trash; // Marker for files to delete + // int trash; // Marker for files to delete int dosflag; // Set to force MSDOS file attributes struct zlist far *nxt; // Pointer to next header in list } TZipFileInfo; diff --git a/src/Crypto/GostCipher.c b/src/Crypto/GostCipher.c index a745210f..ec09bddf 100644 --- a/src/Crypto/GostCipher.c +++ b/src/Crypto/GostCipher.c @@ -75,19 +75,19 @@ static void xor_s_box(byte s_box[8][16], byte *seed) int i; for (i = 0; i < 16; i++) { - s_box[1][i] ^= (seed[ (i * 4) + 0 ] ) & 0xF; - s_box[2][i] ^= (seed[ (i * 4) + 0 ]>>4) & 0xF; - s_box[3][i] ^= (seed[ (i * 4) + 1 ] ) & 0xF; - s_box[4][i] ^= (seed[ (i * 4) + 1 ]>>4) & 0xF; - s_box[5][i] ^= (seed[ (i * 4) + 2 ] ) & 0xF; - s_box[6][i] ^= (seed[ (i * 4) + 2 ]>>4) & 0xF; - s_box[7][i] ^= (seed[ (i * 4) + 3 ] ) & 0xF; - s_box[8][i] ^= (seed[ (i * 4) + 3 ]>>4) & 0xF; + s_box[0][i] ^= (seed[ (i * 4) + 0 ] ) & 0xF; + s_box[1][i] ^= (seed[ (i * 4) + 0 ]>>4) & 0xF; + s_box[2][i] ^= (seed[ (i * 4) + 1 ] ) & 0xF; + s_box[3][i] ^= (seed[ (i * 4) + 1 ]>>4) & 0xF; + s_box[4][i] ^= (seed[ (i * 4) + 2 ] ) & 0xF; + s_box[5][i] ^= (seed[ (i * 4) + 2 ]>>4) & 0xF; + s_box[6][i] ^= (seed[ (i * 4) + 3 ] ) & 0xF; + s_box[7][i] ^= (seed[ (i * 4) + 3 ]>>4) & 0xF; } } #endif -void gost_set_key(byte *key, gost_kds *ks) +void gost_set_key(const byte *key, gost_kds *ks) { #ifdef GOST_DYNAMIC_SBOXES STREEBOG_CTX sctx; @@ -228,11 +228,11 @@ void gost_decrypt_block(uint64 in_, uint64* out_, gost_kds* kds) { } #if defined(_M_AMD64) -void gost_encrypt_128_CBC_asm(byte *in, byte *out, gost_kds *ks, uint64 count); -void gost_decrypt_128_CBC_asm(byte *in, byte *out, gost_kds *ks, uint64 count); +void gost_encrypt_128_CBC_asm(const byte *in, byte *out, gost_kds *ks, uint64 count); +void gost_decrypt_128_CBC_asm(const byte *in, byte *out, gost_kds *ks, uint64 count); #endif -void gost_encrypt(byte *in, byte *out, gost_kds *ks, int count) { +void gost_encrypt(const byte *in, byte *out, gost_kds *ks, int count) { #if defined(_M_AMD64) gost_encrypt_128_CBC_asm(in, out, ks, (uint64)count); #else @@ -249,7 +249,7 @@ void gost_encrypt(byte *in, byte *out, gost_kds *ks, int count) { #endif } -void gost_decrypt(byte *in, byte *out, gost_kds *ks, int count) { +void gost_decrypt(const byte *in, byte *out, gost_kds *ks, int count) { #if defined(_M_AMD64) gost_decrypt_128_CBC_asm(in, out, ks, (uint64)count); #else diff --git a/src/Crypto/GostCipher.h b/src/Crypto/GostCipher.h index 9b9e18b4..35c6537c 100644 --- a/src/Crypto/GostCipher.h +++ b/src/Crypto/GostCipher.h @@ -49,9 +49,9 @@ typedef struct gost_kds #define GOST_KS (sizeof(gost_kds)) -void gost_encrypt(byte *in, byte *out, gost_kds *ks, int count); -void gost_decrypt(byte *in, byte *out, gost_kds *ks, int count); -void gost_set_key(byte *key, gost_kds *ks); +void gost_encrypt(const byte *in, byte *out, gost_kds *ks, int count); +void gost_decrypt(const byte *in, byte *out, gost_kds *ks, int count); +void gost_set_key(const byte *key, gost_kds *ks); #else #define GOST_KS (0) diff --git a/src/Crypto/Streebog.c b/src/Crypto/Streebog.c index 9430bfa3..d13d58d2 100644 --- a/src/Crypto/Streebog.c +++ b/src/Crypto/Streebog.c @@ -2328,9 +2328,9 @@ stage3(STREEBOG_CTX *CTX) memset(buf, 0x00, sizeof buf); #ifndef __GOST3411_BIG_ENDIAN__ - buf[0] = CTX->bufsize << 3; + buf[0] = ((unsigned long long) CTX->bufsize) << 3; #else - buf[0] = BSWAP64(CTX->bufsize << 3); + buf[0] = BSWAP64(((unsigned long long) CTX->bufsize) << 3); #endif pad(CTX); diff --git a/src/Crypto/cpu.c b/src/Crypto/cpu.c index c358088d..35fd36fe 100644 --- a/src/Crypto/cpu.c +++ b/src/Crypto/cpu.c @@ -279,7 +279,7 @@ static int Detect_MS_HyperV_AES () void DetectX86Features() { - uint32 cpuid[4], cpuid1[4]; + uint32 cpuid[4] = {0}, cpuid1[4] = {0}; if (!CpuId(0, cpuid)) return; if (!CpuId(1, cpuid1)) diff --git a/src/Format/Tcformat.c b/src/Format/Tcformat.c index 31140fd7..66ec3ac3 100644 --- a/src/Format/Tcformat.c +++ b/src/Format/Tcformat.c @@ -9206,17 +9206,19 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) { wchar_t szTmp [TC_MAX_PATH + 8000] = {0}; - GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs, szTmp, ARRAYSIZE (szTmp)); - - if (wcslen (szTmp) < 1) + if ((HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs, szTmp, ARRAYSIZE (szTmp))) + && (wcslen (szTmp) >= 1) + ) + { + memset (szFileName, 0, sizeof (szFileName)); + StringCbCopyW (szFileName, sizeof (szFileName), szTmp); + DirectNonSysInplaceDecStartMode = TRUE; + } + else { // No valid volume path specified as command-line parameter AbortProcess ("ERR_PARAMETER_INCORRECT"); } - - memset (szFileName, 0, sizeof (szFileName)); - StringCbCopyW (szFileName, sizeof (szFileName), szTmp); - DirectNonSysInplaceDecStartMode = TRUE; } break; diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index f725d32b..d5c578df 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -10980,6 +10980,8 @@ static BOOL CALLBACK BootLoaderPreferencesDlgProc (HWND hwndDlg, UINT msg, WPARA CheckDlgButton (hwndDlg, IDC_DISABLE_BOOT_LOADER_PIM_PROMPT, BST_UNCHECKED); } + break; + case IDC_DISABLE_BOOT_LOADER_OUTPUT: if ((IsDlgButtonChecked (hwndDlg, IDC_DISABLE_BOOT_LOADER_OUTPUT)) && AskWarnYesNo ("CUSTOM_BOOT_LOADER_MESSAGE_PROMPT", hwndDlg) == IDNO)