diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2014-07-09 05:32:14 +0200 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2014-11-08 23:20:40 +0100 |
commit | 5281e2d3b9adea8dff1730d78fe94af85582aea8 (patch) | |
tree | eaf094f9e339ff1809e2c18bb3e37e88450c6184 | |
parent | 2a288a7e127d37962fa0ec3659d73d8f33bfdc63 (diff) | |
download | VeraCrypt-5281e2d3b9adea8dff1730d78fe94af85582aea8.tar.gz VeraCrypt-5281e2d3b9adea8dff1730d78fe94af85582aea8.zip |
Static Code Analysis : fix resource leakage by ensuring that all Windows handles are released properly
-rw-r--r-- | src/Common/Dlgcode.c | 28 | ||||
-rw-r--r-- | src/Mount/Mount.c | 23 | ||||
-rw-r--r-- | src/Setup/SelfExtract.c | 11 |
3 files changed, 50 insertions, 12 deletions
diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 54b848dc..f645fdec 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -1349,7 +1349,7 @@ HBITMAP RenderBitmap (char *resource, HWND hwndDest, int x, int y, int nWidth, i HDC hdcDest = GetDC (hwndDest);
BitBlt (hdcDest, x, y, nWidth, nHeight, hdcRescaled, 0, 0, SRCCOPY);
- DeleteDC (hdcDest);
+ ReleaseDC (hwndDest, hdcDest);
}
else
{
@@ -3492,6 +3492,8 @@ load: bPortableModeConfirmed = TRUE;
+ if (hDriver != INVALID_HANDLE_VALUE)
+ CloseHandle (hDriver);
hDriver = CreateFile (WIN32_ROOT_PREFIX, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
}
@@ -7484,16 +7486,19 @@ __int64 GetFileSize64 (const char *path) {
HANDLE h = CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
LARGE_INTEGER size;
+ __int64 retSize = -1;
- if (h == INVALID_HANDLE_VALUE)
- return -1;
-
- if (GetFileSizeEx (h, &size) == 0)
- return -1;
+ if (h)
+ {
+ if (GetFileSizeEx (h, &size))
+ {
+ retSize = size.QuadPart;
+ }
- CloseHandle (h);
+ CloseHandle (h);
+ }
- return size.QuadPart;
+ return retSize;
}
@@ -8214,12 +8219,19 @@ BOOL RestartComputer (void) AdjustTokenPrivileges (hTkn, false, &tokenPrivil, 0, (PTOKEN_PRIVILEGES) NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
+ {
+ CloseHandle(hTkn);
return false;
+ }
if (!ExitWindowsEx (EWX_REBOOT,
SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED))
+ {
+ CloseHandle(hTkn);
return false;
+ }
+ CloseHandle(hTkn);
return true;
}
diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index 370c5f57..eee282a8 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -7001,7 +7001,11 @@ BOOL TaskBarIconAdd (HWND hwnd) TaskBarIconMutex = CreateMutex (NULL, TRUE, "VeraCryptTaskBarIcon");
if (TaskBarIconMutex == NULL || GetLastError () == ERROR_ALREADY_EXISTS)
{
- TaskBarIconMutex = NULL;
+ if (TaskBarIconMutex)
+ {
+ CloseHandle(TaskBarIconMutex);
+ TaskBarIconMutex = NULL;
+ }
return FALSE;
}
@@ -8692,7 +8696,12 @@ void AnalyzeKernelMiniDump (HWND hwndDlg) NormalCursor();
DWORD exitCode;
- if (!GetExitCodeProcess (procInfo.hProcess, &exitCode) || exitCode != 0)
+ bool bExitCheck = (!GetExitCodeProcess (procInfo.hProcess, &exitCode) || exitCode != 0);
+
+ CloseHandle(procInfo.hProcess);
+ CloseHandle(procInfo.hThread);
+
+ if (bExitCheck)
return;
}
@@ -8764,6 +8773,10 @@ void AnalyzeKernelMiniDump (HWND hwndDlg) {
handleWin32Error (hwndDlg);
Error ("DEBUGGER_NOT_FOUND");
+ CloseHandle (procInfo.hProcess);
+ CloseHandle (procInfo.hThread);
+ CloseHandle (hChildStdoutRead);
+ CloseHandle (hChildStdoutWrite);
return;
}
@@ -8787,6 +8800,8 @@ void AnalyzeKernelMiniDump (HWND hwndDlg) output.insert (output.size(), pipeBuffer, bytesReceived);
}
+ CloseHandle (hChildStdoutRead);
+
NormalCursor();
bool otherDriver = (StringToUpperCase (output).find (StringToUpperCase (TC_APP_NAME)) == string::npos);
@@ -8868,7 +8883,7 @@ void AnalyzeKernelMiniDump (HWND hwndDlg) retAddrs.push_back (s);
}
- /*
+/*
char url[MAX_URL_LENGTH];
sprintf (url, TC_APPLINK_SECURE "&dest=syserr-report&os=%s&osver=%d.%d.%d&arch=%s&err=%I64x&arg1=%I64x&arg2=%I64x&arg3=%I64x&arg4=%I64x&flag=%s&drv=%s",
GetWindowsEdition().c_str(),
@@ -8943,7 +8958,7 @@ void AnalyzeKernelMiniDump (HWND hwndDlg) if (AskYesNoString (msg.c_str()) == IDYES)
ShellExecute (NULL, "open", urlStr.c_str(), NULL, NULL, SW_SHOWNORMAL);
- */
+*/
}
diff --git a/src/Setup/SelfExtract.c b/src/Setup/SelfExtract.c index 5be9cd21..a14a0db4 100644 --- a/src/Setup/SelfExtract.c +++ b/src/Setup/SelfExtract.c @@ -150,6 +150,8 @@ static int CompressBuffer (char *out, char *in, int len) if (!CreatePipe (&hChildStdinRead, &((HANDLE) hChildStdinWrite), &securityAttrib, 0))
{
PkgError ("Cannot create STDIN pipe.");
+ CloseHandle(hChildStdoutWrite);
+ CloseHandle(hChildStdoutRead);
return 0;
}
SetHandleInformation (hChildStdinWrite, HANDLE_FLAG_INHERIT, 0);
@@ -166,6 +168,10 @@ static int CompressBuffer (char *out, char *in, int len) if (!CreateProcess (NULL, "gzip --best", NULL, NULL, TRUE, 0, NULL, NULL, &startupInfo, &procInfo))
{
PkgError ("Error: Cannot run gzip.\n\nBefore you can create a self-extracting VeraCrypt package, you need to have the open-source 'gzip' compression tool placed in any directory in the search path for executable files (for example, in 'C:\\Windows\\').\n\nNote: gzip can be freely downloaded e.g. from www.gzip.org");
+ CloseHandle(hChildStdoutWrite);
+ CloseHandle(hChildStdoutRead);
+ CloseHandle(hChildStdinRead);
+ CloseHandle(hChildStdinWrite);
return 0;
}
@@ -179,6 +185,8 @@ static int CompressBuffer (char *out, char *in, int len) if (!CloseHandle (hChildStdoutWrite))
{
PkgError ("Cannot close STDOUT write");
+ CloseHandle(hChildStdoutRead);
+ CloseHandle(hChildStdinRead);
return 0;
}
@@ -198,6 +206,9 @@ static int CompressBuffer (char *out, char *in, int len) else
bGzipHeaderRead = TRUE; // Skip the 10-byte gzip header
}
+
+ CloseHandle(hChildStdoutRead);
+ CloseHandle(hChildStdinRead);
return res_len - 8; // A gzip stream ends with a CRC-32 hash and a 32-bit size (those 8 bytes need to be chopped off)
}
|