# HG changeset patch # User Nicholas Hastings # Date 1341316272 14400 # Node ID 440c51204096e474ec420abfb72f78698448a034 # Parent a3b3cb039d7a31eb941ee5fe51e418a7f6f084f8 Fixed clientprefs prefab menu double free crash (bug 5374, r=asherkin). diff -r a3b3cb039d7a -r 440c51204096 extensions/clientprefs/extension.cpp --- a/extensions/clientprefs/extension.cpp Mon Jul 02 23:27:22 2012 -0400 +++ b/extensions/clientprefs/extension.cpp Tue Jul 03 07:51:12 2012 -0400 @@ -105,6 +105,7 @@ sharesys->AddNatives(myself, g_ClientPrefNatives); sharesys->RegisterLibrary(myself, "clientprefs"); + identity = sharesys->CreateIdentity(sharesys->CreateIdentType("ClientPrefs"), this); g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell); g_CookieType = handlesys->CreateType("Cookie", @@ -124,7 +125,7 @@ NULL); IMenuStyle *style = menus->GetDefaultStyle(); - g_CookieManager.clientMenu = style->CreateMenu(&g_Handler, NULL); + g_CookieManager.clientMenu = style->CreateMenu(&g_Handler, identity); g_CookieManager.clientMenu->SetDefaultTitle("Client Settings:"); plsys->AddPluginsListener(&g_CookieManager); @@ -191,10 +192,17 @@ forwards->ReleaseForward(g_CookieManager.cookieDataLoadedForward); - g_CookieManager.clientMenu->Destroy(); + HandleSecurity sec = HandleSecurity(identity, identity); + HandleError err = handlesys->FreeHandle(g_CookieManager.clientMenu->GetHandle(), &sec); + if (HandleError_None != err) + { + g_pSM->LogError(myself, "Error %d when attempting to free client menu handle", err); + } phrases->Destroy(); + sharesys->DestroyIdentity( identity ); + plsys->RemovePluginsListener(&g_CookieManager); playerhelpers->RemoveClientListener(&g_CookieManager); @@ -470,6 +478,11 @@ return true; } +IdentityToken_t *ClientPrefs::GetIdentity() const +{ + return identity; +} + const char *ClientPrefs::GetExtensionVerString() { return SM_FULL_VERSION; diff -r a3b3cb039d7a -r 440c51204096 extensions/clientprefs/extension.h --- a/extensions/clientprefs/extension.h Mon Jul 02 23:27:22 2012 -0400 +++ b/extensions/clientprefs/extension.h Tue Jul 03 07:51:12 2012 -0400 @@ -141,6 +141,8 @@ //virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength); #endif public: + IdentityToken_t *GetIdentity() const; +public: IDBDriver *Driver; IDatabase *Database; bool databaseLoading; @@ -152,6 +154,7 @@ private: SourceHook::List cachedQueries; IMutex *queryMutex; + IdentityToken_t *identity; }; class CookieTypeHandler : public IHandleTypeDispatch diff -r a3b3cb039d7a -r 440c51204096 extensions/clientprefs/menus.cpp --- a/extensions/clientprefs/menus.cpp Mon Jul 02 23:27:22 2012 -0400 +++ b/extensions/clientprefs/menus.cpp Tue Jul 03 07:51:12 2012 -0400 @@ -57,7 +57,7 @@ return; } - IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, NULL); + IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, g_ClientPrefs.GetIdentity()); char message[256]; @@ -175,5 +175,10 @@ void AutoMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason) { - menu->Destroy(true); + HandleSecurity sec = HandleSecurity(g_ClientPrefs.GetIdentity(), g_ClientPrefs.GetIdentity()); + HandleError err = handlesys->FreeHandle(menu->GetHandle(), &sec); + if (HandleError_None != err) + { + g_pSM->LogError(myself, "Error %d when attempting to free automenu handle", err); + } }