diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c index 26fda6616bb..f0f19eecf3f 100644 --- a/dlls/advapi32/crypt.c +++ b/dlls/advapi32/crypt.c @@ -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);