advapi32/crypt: Fixed some HKEY leaks.

This commit is contained in:
Nikolay Sivov 2011-08-04 03:55:56 +04:00 committed by Alexandre Julliard
parent e68b9f9fc9
commit 322049cebf
1 changed files with 22 additions and 7 deletions

View File

@ -1124,6 +1124,7 @@ BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
'P','r','o','v','i','d','e','r',0
};
static const WCHAR typeW[] = {'T','y','p','e',0};
BOOL ret;
TRACE("(%d, %p, %d, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszProvName, pcbProvName);
@ -1145,6 +1146,7 @@ BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
return FALSE;
}
ret = TRUE;
if (!pszProvName)
{
DWORD numkeys;
@ -1156,6 +1158,7 @@ BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
if (!(provNameW = CRYPT_Alloc(*pcbProvName * sizeof(WCHAR))))
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
RegCloseKey(hKey);
return FALSE;
}
@ -1167,7 +1170,7 @@ BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
if (dwIndex >= numkeys)
{
SetLastError(ERROR_NO_MORE_ITEMS);
return FALSE;
ret = FALSE;
}
} else {
DWORD size = sizeof(DWORD);
@ -1178,16 +1181,22 @@ BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
if (result)
{
SetLastError(result);
RegCloseKey(hKey);
return FALSE;
}
if (RegOpenKeyW(hKey, pszProvName, &subkey))
{
RegCloseKey(hKey);
return FALSE;
}
if (RegQueryValueExW(subkey, typeW, NULL, NULL, (BYTE*)pdwProvType, &size))
return FALSE;
ret = FALSE;
RegCloseKey(subkey);
}
RegCloseKey(hKey);
return TRUE;
return ret;
}
/******************************************************************************
@ -1200,7 +1209,7 @@ BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
{
PWSTR str = NULL;
DWORD bufsize;
BOOL ret; /* = FALSE; */
BOOL ret;
TRACE("(%d, %p, %08x, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszProvName, pcbProvName);
@ -1287,19 +1296,24 @@ BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved,
if (dwIndex >= numkeys)
{
SetLastError(ERROR_NO_MORE_ITEMS);
RegCloseKey(hKey);
return FALSE;
}
keylen++;
if ( !(keyname = CRYPT_Alloc(keylen*sizeof(WCHAR))) )
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
RegCloseKey(hKey);
return FALSE;
}
if ( RegEnumKeyW(hKey, dwIndex, keyname, keylen) ) {
CRYPT_Free(keyname);
RegCloseKey(hKey);
return FALSE;
}
RegOpenKeyW(hKey, keyname, &hSubkey);
RegCloseKey(hKey);
ch = keyname + strlenW(keyname);
/* Convert "Type 000" to 0, etc/ */
*pdwProvType = *(--ch) - '0';
@ -1311,11 +1325,11 @@ BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved,
if (result)
{
SetLastError(result);
RegCloseKey(hSubkey);
return FALSE;
}
RegCloseKey(hSubkey);
RegCloseKey(hKey);
return TRUE;
}
@ -1502,6 +1516,8 @@ BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved,
CRYPT_Free(keyname);
result = RegQueryValueExW(hKey, nameW, NULL, NULL, (LPBYTE)pszProvName, pcbProvName);
RegCloseKey(hKey);
if (result)
{
if (result != ERROR_MORE_DATA)
@ -1512,7 +1528,6 @@ BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved,
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
@ -1526,7 +1541,7 @@ BOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved,
{
PWSTR str = NULL;
DWORD bufsize;
BOOL ret = FALSE;
BOOL ret;
TRACE("(%d, %p, %08x, %p, %p)\n", dwProvType, pdwReserved, dwFlags, pszProvName, pcbProvName);