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