Nikolay Sivov : shell32: Fix handle leak on consecutive Init() calls.

Alexandre Julliard julliard at winehq.org
Mon Sep 9 16:08:08 CDT 2013


Module: wine
Branch: master
Commit: f0d17b5c171c8814851f740280e103681bce0c22
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f0d17b5c171c8814851f740280e103681bce0c22

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Sep  9 11:35:37 2013 +0400

shell32: Fix handle leak on consecutive Init() calls.

---

 dlls/shell32/assoc.c       |   11 +++++++++--
 dlls/shell32/tests/assoc.c |   28 ++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/dlls/shell32/assoc.c b/dlls/shell32/assoc.c
index 77b0a2d..848bf87 100644
--- a/dlls/shell32/assoc.c
+++ b/dlls/shell32/assoc.c
@@ -184,6 +184,10 @@ static HRESULT WINAPI IQueryAssociations_fnInit(
         FIXME("hwnd != NULL not supported\n");
     if (cfFlags != 0)
 	FIXME("unsupported flags: %x\n", cfFlags);
+
+    RegCloseKey(This->hkeySource);
+    RegCloseKey(This->hkeyProgID);
+    This->hkeySource = This->hkeyProgID = NULL;
     if (pszAssoc != NULL)
     {
         ret = RegOpenKeyExW(HKEY_CLASSES_ROOT,
@@ -191,8 +195,8 @@ static HRESULT WINAPI IQueryAssociations_fnInit(
                             0,
                             KEY_READ,
                             &This->hkeySource);
-        if (ret != ERROR_SUCCESS)
-            return E_FAIL;
+        if (ret)
+            return S_OK;
         /* if this is not a prog id */
         if ((*pszAssoc == '.') || (*pszAssoc == '{'))
         {
@@ -468,6 +472,9 @@ static HRESULT WINAPI IQueryAssociations_fnGetString(
   if (!pcchOut)
     return E_UNEXPECTED;
 
+  if (!This->hkeySource && !This->hkeyProgID)
+    return HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION);
+
   switch (str)
   {
     case ASSOCSTR_COMMAND:
diff --git a/dlls/shell32/tests/assoc.c b/dlls/shell32/tests/assoc.c
index abfe6d4..ff999e9 100644
--- a/dlls/shell32/tests/assoc.c
+++ b/dlls/shell32/tests/assoc.c
@@ -103,6 +103,8 @@ struct assoc_getstring_test
 };
 
 static const WCHAR httpW[] = {'h','t','t','p',0};
+static const WCHAR httpsW[] = {'h','t','t','p','s',0};
+static const WCHAR badW[] = {'b','a','d','b','a','d',0};
 
 static struct assoc_getstring_test getstring_tests[] =
 {
@@ -163,6 +165,31 @@ static void test_IQueryAssociations_GetString(void)
     IQueryAssociations_Release(assoc);
 }
 
+static void test_IQueryAssociations_Init(void)
+{
+    IQueryAssociations *assoc;
+    HRESULT hr;
+    DWORD len;
+
+    hr = CoCreateInstance(&CLSID_QueryAssociations, NULL, CLSCTX_INPROC_SERVER, &IID_IQueryAssociations, (void*)&assoc);
+    ok(hr == S_OK, "failed to create object, 0x%x\n", hr);
+
+    hr = IQueryAssociations_Init(assoc, 0, NULL, NULL, NULL);
+    ok(hr == E_INVALIDARG, "Init failed, 0x%08x\n", hr);
+
+    hr = IQueryAssociations_Init(assoc, 0, httpW, NULL, NULL);
+    ok(hr == S_OK, "Init failed, 0x%08x\n", hr);
+
+    hr = IQueryAssociations_Init(assoc, 0, badW, NULL, NULL);
+    ok(hr == S_OK || broken(hr == S_FALSE) /* pre-vista */, "Init failed, 0x%08x\n", hr);
+
+    len = 0;
+    hr = IQueryAssociations_GetString(assoc, 0, ASSOCSTR_EXECUTABLE, NULL, NULL, &len);
+    ok(hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) || broken(hr == E_FAIL) /* pre-vista */, "got 0x%08x\n", hr);
+
+    IQueryAssociations_Release(assoc);
+}
+
 START_TEST(assoc)
 {
     IQueryAssociations *qa;
@@ -176,6 +203,7 @@ START_TEST(assoc)
     {
         test_IQueryAssociations_QueryInterface();
         test_IQueryAssociations_GetString();
+        test_IQueryAssociations_Init();
 
         IQueryAssociations_Release(qa);
     }




More information about the wine-cvs mailing list