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