Don't allocate/delete across static CRTs (no bug, irc r=fyren+psychonic).
Don't allocate/delete across static CRTs (no bug, irc r=fyren+psychonic).
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;