From b36cb0b94dd7abbf767f3ef22a04f2b3d9e81dde Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 13 Mar 2012 14:09:30 +0100 Subject: [PATCH] urlmon: Clean session related data in free_session function. --- dlls/urlmon/session.c | 27 +++++++++++++++++---------- dlls/urlmon/urlmon_main.c | 12 +++++------- dlls/urlmon/urlmon_main.h | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c index 24ed2e5583a..d61a35e4628 100644 --- a/dlls/urlmon/session.c +++ b/dlls/urlmon/session.c @@ -119,7 +119,7 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid, return SUCCEEDED(hres) ? S_OK : MK_E_SYNTAX; } -static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol) +HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol) { name_space *new_name_space; @@ -165,15 +165,6 @@ static HRESULT unregister_namespace(IClassFactory *cf, LPCWSTR protocol) return S_OK; } - -void register_urlmon_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL do_register) -{ - if(do_register) - register_namespace(cf, clsid, protocol, TRUE); - else - unregister_namespace(cf, protocol); -} - BOOL is_registered_protocol(LPCWSTR url) { DWORD schema_len; @@ -675,5 +666,21 @@ HRESULT WINAPI ObtainUserAgentString(DWORD dwOption, LPSTR pcszUAOut, DWORD *cbS void free_session(void) { + name_space *ns_iter, *ns_last; + mime_filter *mf_iter, *mf_last; + + LIST_FOR_EACH_ENTRY_SAFE(ns_iter, ns_last, &name_space_list, name_space, entry) { + if(!ns_iter->urlmon) + IClassFactory_Release(ns_iter->cf); + heap_free(ns_iter->protocol); + heap_free(ns_iter); + } + + LIST_FOR_EACH_ENTRY_SAFE(mf_iter, mf_last, &mime_filter_list, mime_filter, entry) { + IClassFactory_Release(mf_iter->cf); + heap_free(mf_iter->mime); + heap_free(mf_iter); + } + heap_free(user_agent); } diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index e22f0373dad..3fea58c884b 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -42,7 +42,7 @@ LONG URLMON_refCount = 0; static HMODULE hCabinet = NULL; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; -static void init_session(BOOL); +static void init_session(void); static struct list tls_list = LIST_INIT(tls_list); @@ -136,7 +136,6 @@ static void process_detach(void) if (hCabinet) FreeLibrary(hCabinet); - init_session(FALSE); free_session(); free_tls_list(); } @@ -152,7 +151,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) switch(fdwReason) { case DLL_PROCESS_ATTACH: - init_session(TRUE); + init_session(); break; case DLL_PROCESS_DETACH: @@ -327,15 +326,14 @@ static const struct object_creation_info object_creation[] = { &CLSID_CUri, &CUriCF.IClassFactory_iface, NULL } }; -static void init_session(BOOL init) +static void init_session(void) { unsigned int i; for(i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) { - if(object_creation[i].protocol) - register_urlmon_namespace(object_creation[i].cf, object_creation[i].clsid, - object_creation[i].protocol, init); + register_namespace(object_creation[i].cf, object_creation[i].clsid, + object_creation[i].protocol, TRUE); } } diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 391b1b34c4c..be9bc7fa878 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -68,7 +68,7 @@ IInternetProtocolInfo *get_protocol_info(LPCWSTR) DECLSPEC_HIDDEN; HRESULT get_protocol_handler(IUri*,CLSID*,BOOL*,IClassFactory**) DECLSPEC_HIDDEN; IInternetProtocol *get_mime_filter(LPCWSTR) DECLSPEC_HIDDEN; BOOL is_registered_protocol(LPCWSTR) DECLSPEC_HIDDEN; -void register_urlmon_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL) DECLSPEC_HIDDEN; +HRESULT register_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL) DECLSPEC_HIDDEN; HINTERNET get_internet_session(IInternetBindInfo*) DECLSPEC_HIDDEN; LPWSTR get_useragent(void) DECLSPEC_HIDDEN; void free_session(void) DECLSPEC_HIDDEN;