hcrypto: w32crypto crypt provider handle leak
_hc_CryptProvider() returns a global handle to a Win32 Crypt Provider. If the global handle is NULL, then a handle is allocated. Unfortunately, due to a coding mistake the global handle variable, g_cryptprovider, was never set and a new handle was allocated with each call. Refactor the function to ensure that the global handle is the value that is returned. Use NULL instead of 0 for pointer assignment. Change-Id: If1ef3aa19cbd1d51860370db24c086e86922ff0d
This commit is contained in:
@@ -43,16 +43,16 @@
|
||||
|
||||
#include "randi.h"
|
||||
|
||||
volatile static HCRYPTPROV g_cryptprovider = 0;
|
||||
volatile static HCRYPTPROV g_cryptprovider = NULL;
|
||||
|
||||
static HCRYPTPROV
|
||||
_hc_CryptProvider(void)
|
||||
{
|
||||
BOOL rv;
|
||||
HCRYPTPROV cryptprovider = 0;
|
||||
HCRYPTPROV cryptprovider = NULL;
|
||||
|
||||
if (g_cryptprovider != 0)
|
||||
return g_cryptprovider;
|
||||
if (g_cryptprovider != NULL)
|
||||
goto out;
|
||||
|
||||
rv = CryptAcquireContext(&cryptprovider, NULL,
|
||||
MS_ENHANCED_PROV, PROV_RSA_FULL,
|
||||
@@ -82,15 +82,15 @@ _hc_CryptProvider(void)
|
||||
CRYPT_VERIFYCONTEXT);
|
||||
}
|
||||
|
||||
if (rv &&
|
||||
if (rv == 0 &&
|
||||
InterlockedCompareExchangePointer((PVOID *) &g_cryptprovider,
|
||||
(PVOID) cryptprovider, 0) != 0) {
|
||||
(PVOID) cryptprovider, NULL) != 0) {
|
||||
|
||||
CryptReleaseContext(cryptprovider, 0);
|
||||
cryptprovider = g_cryptprovider;
|
||||
}
|
||||
|
||||
return cryptprovider;
|
||||
out:
|
||||
return g_cryptprovider;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user