Module: wine Branch: refs/heads/master Commit: bcd6e9f33b23e9b9c78460acd5dc36ef29c74674 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=bcd6e9f33b23e9b9c78460ac...
Author: Jacek Caban jacek@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; }
/***********************************************************************