Module: wine Branch: master Commit: 322049cebf2c08875bfe8fe1d9d62ead6d856079 URL: http://source.winehq.org/git/wine.git/?a=commit;h=322049cebf2c08875bfe8fe1d9...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Aug 4 03:55:56 2011 +0400
advapi32/crypt: Fixed some HKEY leaks.
---
dlls/advapi32/crypt.c | 29 ++++++++++++++++++++++------- 1 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c index 26fda66..f0f19ee 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);