Don't allocate/delete across static CRTs (no bug, irc r=fyren+psychonic).
authorDavid Anderson <dvander@alliedmods.net>
Sun Mar 31 13:30:22 2013 -0700 (2013-03-31)
changeset 38817ec742e7d629
parent 3880 48eed18701f0
child 3882 7dae5b0b8e28
Don't allocate/delete across static CRTs (no bug, irc r=fyren+psychonic).
core/CoreConfig.cpp
core/PlayerManager.cpp
core/logic/ExtensionSys.cpp
core/logic/ExtensionSys.h
core/logic/PluginSys.cpp
core/logic/PluginSys.h
core/logic/intercom.h
     1.1 --- a/core/CoreConfig.cpp	Sun Mar 31 09:50:46 2013 -0700
     1.2 +++ b/core/CoreConfig.cpp	Sun Mar 31 13:30:22 2013 -0700
     1.3 @@ -545,11 +545,10 @@
     1.4  
     1.5  	engine->ServerCommand("exec sourcemod/sourcemod.cfg\n");
     1.6  
     1.7 -	CVector<SMPlugin *> plugins;
     1.8 -	scripts->ListPlugins(&plugins);
     1.9 -	for (size_t i = 0; i < plugins.size(); i++)
    1.10 +	AutoPluginList plugins(scripts);
    1.11 +	for (size_t i = 0; i < plugins->size(); i++)
    1.12  	{
    1.13 -		SMPlugin *plugin = plugins[i];
    1.14 +		SMPlugin *plugin = plugins->at(i);
    1.15  		unsigned int num = plugin->GetConfigCount();
    1.16  		bool can_create = true;
    1.17  		for (unsigned int i=0; i<num; i++)
     2.1 --- a/core/PlayerManager.cpp	Sun Mar 31 09:50:46 2013 -0700
     2.2 +++ b/core/PlayerManager.cpp	Sun Mar 31 13:30:22 2013 -0700
     2.3 @@ -783,10 +783,8 @@
     2.4  	unsigned int id = 0;
     2.5  	unsigned int start = 0;
     2.6  
     2.7 -	CVector<IExtension *> extensions;
     2.8 -	extsys->ListExtensions(&extensions);
     2.9 -
    2.10 -	if (!extensions.size())
    2.11 +	AutoExtensionList extensions(extsys);
    2.12 +	if (!extensions->size())
    2.13  	{
    2.14  		ClientConsolePrint(player->GetEdict(), "[SM] No extensions found.");
    2.15  		return;
    2.16 @@ -797,13 +795,10 @@
    2.17  		start = atoi(args.Arg(2));
    2.18  	}
    2.19  
    2.20 -	SourceHook::CVector<IExtension *>::iterator iter;
    2.21 -
    2.22 -	for (iter = extensions.begin();
    2.23 -		 iter != extensions.end();
    2.24 -		 iter++)
    2.25 +	size_t i = 0;
    2.26 +	for (; i < extensions->size(); i++)
    2.27  	{
    2.28 -		IExtension *ext = (*iter);
    2.29 +		IExtension *ext = extensions->at(i);
    2.30  
    2.31  		char error[255];
    2.32  		if (!ext->IsRunning(error, sizeof(error)))
    2.33 @@ -850,16 +845,16 @@
    2.34  		ClientConsolePrint(player->GetEdict(), "%s", buffer);
    2.35  	}
    2.36  
    2.37 -	for (; iter != extensions.end(); iter++)
    2.38 +	for (; i < extensions->size(); i++)
    2.39  	{
    2.40  		char error[255];
    2.41 -		if ((*iter)->IsRunning(error, sizeof(error)))
    2.42 +		if (extensions->at(i)->IsRunning(error, sizeof(error)))
    2.43  		{
    2.44  			break;
    2.45  		}
    2.46  	}
    2.47  
    2.48 -	if (iter != extensions.end())
    2.49 +	if (i < extensions->size())
    2.50  	{
    2.51  		ClientConsolePrint(player->GetEdict(), "To see more, type \"sm exts %d\"", id);
    2.52  	}
    2.53 @@ -872,10 +867,8 @@
    2.54  	edict_t *e = player->GetEdict();
    2.55  	unsigned int start = 0;
    2.56  
    2.57 -	CVector<SMPlugin *> plugins;
    2.58 -	scripts->ListPlugins(&plugins);
    2.59 -
    2.60 -	if (!plugins.size())
    2.61 +	AutoPluginList plugins(scripts);
    2.62 +	if (!plugins->size())
    2.63  	{
    2.64  		ClientConsolePrint(e, "[SM] No plugins found.");
    2.65  		return;
    2.66 @@ -888,10 +881,10 @@
    2.67  
    2.68  	SourceHook::List<SMPlugin *> m_FailList;
    2.69  
    2.70 -	CVector<SMPlugin *>::iterator iter = plugins.begin();
    2.71 -	for (; iter != plugins.end(); iter++)
    2.72 +	size_t i = 0;
    2.73 +	for (; i < plugins->size(); i++)
    2.74  	{
    2.75 -		SMPlugin *pl = *iter;
    2.76 +		SMPlugin *pl = plugins->at(i);
    2.77  
    2.78  		if (pl->GetStatus() != Plugin_Running)
    2.79  		{
    2.80 @@ -929,16 +922,16 @@
    2.81  	}
    2.82  
    2.83  	/* See if we can get more plugins */
    2.84 -	for (; iter != plugins.end(); iter++)
    2.85 +	for (; i < plugins->size(); i++)
    2.86  	{
    2.87 -		if ((*iter)->GetStatus() == Plugin_Running)
    2.88 +		if (plugins->at(i)->GetStatus() == Plugin_Running)
    2.89  		{
    2.90  			break;
    2.91  		}
    2.92  	}
    2.93  
    2.94  	/* Do we actually have more plugins? */
    2.95 -	if (iter != plugins.end())
    2.96 +	if (i < plugins->size())
    2.97  	{
    2.98  		ClientConsolePrint(e, "To see more, type \"sm plugins %d\"", id);
    2.99  	}
     3.1 --- a/core/logic/ExtensionSys.cpp	Sun Mar 31 09:50:46 2013 -0700
     3.2 +++ b/core/logic/ExtensionSys.cpp	Sun Mar 31 13:30:22 2013 -0700
     3.3 @@ -1361,12 +1361,17 @@
     3.4  	}
     3.5  }
     3.6  
     3.7 -void CExtensionManager::ListExtensions(CVector<IExtension *> *list)
     3.8 +const CVector<IExtension *> *CExtensionManager::ListExtensions()
     3.9  {
    3.10 +	CVector<IExtension *> *list = new CVector<IExtension *>();
    3.11  	for (List<CExtension *>::iterator iter = m_Libs.begin(); iter != m_Libs.end(); iter++)
    3.12 -	{
    3.13  		list->push_back(*iter);
    3.14 -	}
    3.15 +	return list;
    3.16 +}
    3.17 +
    3.18 +void CExtensionManager::FreeExtensionList(const CVector<IExtension *> *list)
    3.19 +{
    3.20 +	delete const_cast<CVector<IExtension *> *>(list);
    3.21  }
    3.22  
    3.23  bool CLocalExtension::IsSameFile(const char *file)
     4.1 --- a/core/logic/ExtensionSys.h	Sun Mar 31 09:50:46 2013 -0700
     4.2 +++ b/core/logic/ExtensionSys.h	Sun Mar 31 13:30:22 2013 -0700
     4.3 @@ -174,7 +174,8 @@
     4.4  	bool LibraryExists(const char *library);
     4.5  	void CallOnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax);
     4.6  	void AddRawDependency(IExtension *ext, IdentityToken_t *other, void *iface);
     4.7 -	void ListExtensions(CVector<IExtension *> *list);
     4.8 +	const CVector<IExtension *> *ListExtensions();
     4.9 +	void FreeExtensionList(const CVector<IExtension *> *list);
    4.10  public:
    4.11  	CExtension *GetExtensionFromIdent(IdentityToken_t *ptr);
    4.12  	void Shutdown();
     5.1 --- a/core/logic/PluginSys.cpp	Sun Mar 31 09:50:46 2013 -0700
     5.2 +++ b/core/logic/PluginSys.cpp	Sun Mar 31 13:30:22 2013 -0700
     5.3 @@ -2627,14 +2627,19 @@
     5.4  	}
     5.5  }
     5.6  
     5.7 -void CPluginManager::ListPlugins(CVector<SMPlugin *> *list)
     5.8 +const CVector<SMPlugin *> *CPluginManager::ListPlugins()
     5.9  {
    5.10 -	List<CPlugin *>::iterator iter;
    5.11 +	CVector<SMPlugin *> *list = new CVector<SMPlugin *>();
    5.12 +
    5.13 +	for (List<CPlugin *>::iterator iter = m_plugins.begin(); iter != m_plugins.end(); iter++)
    5.14 +		list->push_back((*iter));
    5.15  
    5.16 -	for (iter = m_plugins.begin(); iter != m_plugins.end(); iter++)
    5.17 -	{
    5.18 -		list->push_back((*iter));
    5.19 -	}
    5.20 +	return list;
    5.21 +}
    5.22 +
    5.23 +void CPluginManager::FreePluginList(const CVector<SMPlugin *> *list)
    5.24 +{
    5.25 +	delete const_cast<CVector<SMPlugin *> *>(list);
    5.26  }
    5.27  
    5.28  class OldPluginAPI : public IPluginManager
     6.1 --- a/core/logic/PluginSys.h	Sun Mar 31 09:50:46 2013 -0700
     6.2 +++ b/core/logic/PluginSys.h	Sun Mar 31 13:30:22 2013 -0700
     6.3 @@ -325,7 +325,8 @@
     6.4  	SMPlugin *FindPluginByHandle(Handle_t hndl, HandleError *errp) {
     6.5  		return static_cast<SMPlugin *>(PluginFromHandle(hndl, errp));
     6.6  	}
     6.7 -	void ListPlugins(CVector<SMPlugin *> *plugins);
     6.8 +	const CVector<SMPlugin *> *ListPlugins();
     6.9 +	void FreePluginList(const CVector<SMPlugin *> *plugins);
    6.10  public: //SMGlobalClass
    6.11  	void OnSourceModAllInitialized();
    6.12  	void OnSourceModShutdown();
     7.1 --- a/core/logic/intercom.h	Sun Mar 31 09:50:46 2013 -0700
     7.2 +++ b/core/logic/intercom.h	Sun Mar 31 13:30:22 2013 -0700
     7.3 @@ -1,5 +1,5 @@
     7.4  /**
     7.5 - * vim: set ts=4 :
     7.6 + * vim: set ts=4 sw=4 tw=99 noet:
     7.7   * =============================================================================
     7.8   * SourceMod
     7.9   * Copyright (C) 2004-2009 AlliedModders LLC.  All rights reserved.
    7.10 @@ -49,7 +49,7 @@
    7.11   * Add 1 to the RHS of this expression to bump the intercom file
    7.12   * This is to prevent mismatching core/logic binaries
    7.13   */
    7.14 -#define SM_LOGIC_MAGIC		(0x0F47C0DE - 19)
    7.15 +#define SM_LOGIC_MAGIC		(0x0F47C0DE - 20)
    7.16  
    7.17  #if defined SM_LOGIC
    7.18  class IVEngineServer
    7.19 @@ -141,7 +141,8 @@
    7.20  	virtual SMPlugin *FindPluginByConsoleArg(const char *text) = 0;
    7.21  	virtual SMPlugin *FindPluginByHandle(Handle_t hndl, HandleError *errp) = 0;
    7.22  	virtual bool UnloadPlugin(IPlugin *plugin) = 0;
    7.23 -	virtual void ListPlugins(CVector<SMPlugin *> *plugins) = 0;
    7.24 +	virtual const CVector<SMPlugin *> *ListPlugins() = 0;
    7.25 +	virtual void FreePluginList(const CVector<SMPlugin *> *list) = 0;
    7.26  	virtual void AddFunctionsToForward(const char *name, IChangeableForward *fwd) = 0;
    7.27  };
    7.28  
    7.29 @@ -157,7 +158,48 @@
    7.30  	virtual IExtension *GetExtensionFromIdent(IdentityToken_t *token) = 0;
    7.31  	virtual void BindChildPlugin(IExtension *ext, SMPlugin *plugin) = 0;
    7.32  	virtual void AddRawDependency(IExtension *myself, IdentityToken_t *token, void *iface) = 0;
    7.33 -	virtual void ListExtensions(CVector<IExtension *> *list) = 0;
    7.34 +	virtual const CVector<IExtension *> *ListExtensions() = 0;
    7.35 +	virtual void FreeExtensionList(const CVector<IExtension *> *list) = 0;
    7.36 +};
    7.37 +
    7.38 +class AutoPluginList
    7.39 +{
    7.40 +public:
    7.41 +	AutoPluginList(IScriptManager *scripts)
    7.42 +		: scripts_(scripts), list_(scripts->ListPlugins())
    7.43 +	{
    7.44 +	}
    7.45 +	~AutoPluginList()
    7.46 +	{
    7.47 +		scripts_->FreePluginList(list_);
    7.48 +	}
    7.49 +	const CVector<SMPlugin *> *operator ->()
    7.50 +	{
    7.51 +		return list_;
    7.52 +	}
    7.53 +private:
    7.54 +	IScriptManager *scripts_;
    7.55 +	const CVector<SMPlugin *> *list_;
    7.56 +};
    7.57 +
    7.58 +class AutoExtensionList
    7.59 +{
    7.60 +public:
    7.61 +	AutoExtensionList(IExtensionSys *extensions)
    7.62 +		: extensions_(extensions), list_(extensions_->ListExtensions())
    7.63 +	{
    7.64 +	}
    7.65 +	~AutoExtensionList()
    7.66 +	{
    7.67 +		extensions_->FreeExtensionList(list_);
    7.68 +	}
    7.69 +	const CVector<IExtension *> *operator ->()
    7.70 +	{
    7.71 +		return list_;
    7.72 +	}
    7.73 +private:
    7.74 +	IExtensionSys *extensions_;
    7.75 +	const CVector<IExtension *> *list_;
    7.76  };
    7.77  
    7.78  class CCommand;