Fixed clientprefs prefab menu double free crash (bug 5374, r=asherkin).
This commit is contained in:
parent
49ad25d001
commit
3479e452de
@ -105,6 +105,7 @@ bool ClientPrefs::SDK_OnLoad(char *error, size_t maxlength, bool late)
|
|||||||
|
|
||||||
sharesys->AddNatives(myself, g_ClientPrefNatives);
|
sharesys->AddNatives(myself, g_ClientPrefNatives);
|
||||||
sharesys->RegisterLibrary(myself, "clientprefs");
|
sharesys->RegisterLibrary(myself, "clientprefs");
|
||||||
|
identity = sharesys->CreateIdentity(sharesys->CreateIdentType("ClientPrefs"), this);
|
||||||
g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell);
|
g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell);
|
||||||
|
|
||||||
g_CookieType = handlesys->CreateType("Cookie",
|
g_CookieType = handlesys->CreateType("Cookie",
|
||||||
@ -124,7 +125,7 @@ bool ClientPrefs::SDK_OnLoad(char *error, size_t maxlength, bool late)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
IMenuStyle *style = menus->GetDefaultStyle();
|
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:");
|
g_CookieManager.clientMenu->SetDefaultTitle("Client Settings:");
|
||||||
|
|
||||||
plsys->AddPluginsListener(&g_CookieManager);
|
plsys->AddPluginsListener(&g_CookieManager);
|
||||||
@ -191,10 +192,17 @@ void ClientPrefs::SDK_OnUnload()
|
|||||||
|
|
||||||
forwards->ReleaseForward(g_CookieManager.cookieDataLoadedForward);
|
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();
|
phrases->Destroy();
|
||||||
|
|
||||||
|
sharesys->DestroyIdentity( identity );
|
||||||
|
|
||||||
plsys->RemovePluginsListener(&g_CookieManager);
|
plsys->RemovePluginsListener(&g_CookieManager);
|
||||||
playerhelpers->RemoveClientListener(&g_CookieManager);
|
playerhelpers->RemoveClientListener(&g_CookieManager);
|
||||||
|
|
||||||
@ -470,6 +478,11 @@ bool Translate(char *buffer,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IdentityToken_t *ClientPrefs::GetIdentity() const
|
||||||
|
{
|
||||||
|
return identity;
|
||||||
|
}
|
||||||
|
|
||||||
const char *ClientPrefs::GetExtensionVerString()
|
const char *ClientPrefs::GetExtensionVerString()
|
||||||
{
|
{
|
||||||
return SM_FULL_VERSION;
|
return SM_FULL_VERSION;
|
||||||
|
@ -140,6 +140,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
|
//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
|
||||||
#endif
|
#endif
|
||||||
|
public:
|
||||||
|
IdentityToken_t *GetIdentity() const;
|
||||||
public:
|
public:
|
||||||
IDBDriver *Driver;
|
IDBDriver *Driver;
|
||||||
IDatabase *Database;
|
IDatabase *Database;
|
||||||
@ -152,6 +154,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
SourceHook::List<TQueryOp *> cachedQueries;
|
SourceHook::List<TQueryOp *> cachedQueries;
|
||||||
IMutex *queryMutex;
|
IMutex *queryMutex;
|
||||||
|
IdentityToken_t *identity;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CookieTypeHandler : public IHandleTypeDispatch
|
class CookieTypeHandler : public IHandleTypeDispatch
|
||||||
|
@ -57,7 +57,7 @@ void ClientMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int i
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, NULL);
|
IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, g_ClientPrefs.GetIdentity());
|
||||||
|
|
||||||
char message[256];
|
char message[256];
|
||||||
|
|
||||||
@ -175,5 +175,10 @@ void AutoMenuHandler::OnMenuSelect(SourceMod::IBaseMenu *menu, int client, unsig
|
|||||||
|
|
||||||
void AutoMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason)
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user