[PATCH 1/1] Fixed some HKEY leaks

Nikolay Sivov nsivov at codeweavers.com
Wed Aug 3 18:55:56 CDT 2011


---
 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);
 
-- 
1.5.6.5


--------------030208070004080509060502--



More information about the wine-patches mailing list