Jacek Caban : urlmon: Fix implementation of ReleaseBindInfo.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 25 14:18:42 CDT 2006


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 25 18:43:34 2006 +0200

urlmon: Fix implementation of ReleaseBindInfo.

---

 dlls/urlmon/tests/misc.c  |   46 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/urlmon/urlmon_main.c |   15 +++++++++++++--
 2 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c
index 9bc52f2..0a1da4a 100644
--- a/dlls/urlmon/tests/misc.c
+++ b/dlls/urlmon/tests/misc.c
@@ -58,6 +58,7 @@ #define CHECK_CALLED(func) \
 DEFINE_EXPECT(ParseUrl);
 DEFINE_EXPECT(QI_IInternetProtocolInfo);
 DEFINE_EXPECT(CreateInstance);
+DEFINE_EXPECT(unk_Release);
 
 static void test_CreateFormatEnum(void)
 {
@@ -829,6 +830,50 @@ static void test_NameSpace(void)
     IInternetSession_Release(session);
 }
 
+static ULONG WINAPI unk_Release(IUnknown *iface)
+{
+    CHECK_EXPECT(unk_Release);
+    return 0;
+}
+
+static const IUnknownVtbl unk_vtbl = {
+    (void*)0xdeadbeef,
+    (void*)0xdeadbeef,
+    unk_Release
+};
+
+static void test_ReleaseBindInfo(void)
+{
+    BINDINFO bi;
+    IUnknown unk = { &unk_vtbl };
+
+    ReleaseBindInfo(NULL); /* shouldn't crash */
+
+    memset(&bi, 0, sizeof(bi));
+    bi.cbSize = sizeof(BINDINFO);
+    bi.pUnk = &unk;
+    SET_EXPECT(unk_Release);
+    ReleaseBindInfo(&bi);
+    ok(bi.cbSize == sizeof(BINDINFO), "bi.cbSize=%ld, expected %d\n",
+       bi.cbSize, sizeof(bi));
+    ok(bi.pUnk == NULL, "bi.pUnk=%p, expected NULL\n", bi.pUnk);
+    CHECK_CALLED(unk_Release);
+
+    memset(&bi, 0, sizeof(bi));
+    bi.cbSize = offsetof(BINDINFO, pUnk);
+    bi.pUnk = &unk;
+    ReleaseBindInfo(&bi);
+    ok(bi.cbSize == offsetof(BINDINFO, pUnk), "bi.cbSize=%ld, expected %d\n",
+       bi.cbSize, sizeof(bi));
+    ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk);
+
+    memset(&bi, 0, sizeof(bi));
+    bi.pUnk = &unk;
+    ReleaseBindInfo(&bi);
+    ok(!bi.cbSize, "bi.cbSize=%ld, expected 0\n", bi.cbSize);
+    ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk);
+}
+
 START_TEST(misc)
 {
     OleInitialize(NULL);
@@ -842,6 +887,7 @@ START_TEST(misc)
     test_SecurityManager();
     test_ZoneManager();
     test_NameSpace();
+    test_ReleaseBindInfo();
 
     OleUninitialize();
 }
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index edec353..0cd57bc 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -35,6 +35,7 @@ #include "wine/unicode.h"
 #include "winuser.h"
 #include "urlmon.h"
 #include "urlmon_main.h"
+#include "ole2.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
@@ -370,15 +371,25 @@ HRESULT WINAPI CoGetClassObjectFromURL( 
  */
 void WINAPI ReleaseBindInfo(BINDINFO* pbindinfo)
 {
+    DWORD size;
+
     TRACE("(%p)\n", pbindinfo);
 
-    if(!pbindinfo)
+    if(!pbindinfo || !(size = pbindinfo->cbSize))
         return;
 
     CoTaskMemFree(pbindinfo->szExtraInfo);
+    ReleaseStgMedium(&pbindinfo->stgmedData);
+
+    if(offsetof(BINDINFO, szExtraInfo) < size)
+        CoTaskMemFree(pbindinfo->szCustomVerb);
 
-    if(pbindinfo->pUnk)
+
+    if(pbindinfo->pUnk && offsetof(BINDINFO, pUnk) < size)
         IUnknown_Release(pbindinfo->pUnk);
+
+    memset(pbindinfo, 0, size);
+    pbindinfo->cbSize = size;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list