From d5d7e8c9cffaa2e6a98d121615bee5a8b048d6cb Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 16 Sep 2015 21:12:22 -0700 Subject: [PATCH] Factor guts of _LoadPlugin into a separate function. --- core/logic/PluginSys.cpp | 38 ++++++++++++++++++++++++-------------- core/logic/PluginSys.h | 1 + 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/core/logic/PluginSys.cpp b/core/logic/PluginSys.cpp index 8dfb4e95..b1cc8a73 100644 --- a/core/logic/PluginSys.cpp +++ b/core/logic/PluginSys.cpp @@ -924,23 +924,11 @@ LoadRes CPluginManager::_LoadPlugin(CPlugin **aResult, const char *path, bool de } } - pPlugin = CPlugin::CreatePlugin(path, error, maxlength); - assert(pPlugin != NULL); + CPlugin *plugin = CompileAndPrep(path, error, maxlength); - if (pPlugin->m_status == Plugin_Uncompiled) { - pPlugin->TryCompile(error, maxlength); - } - if (pPlugin->m_status == Plugin_Created) { - MalwareCheckPass(pPlugin, error, maxlength); - } - LoadRes loadFailure = LoadRes_Failure; /* Get the status */ - if (pPlugin->GetStatus() == Plugin_Created) - { - /* First native pass - add anything from Core */ - g_ShareSys.BindNativesToPlugin(pPlugin, true); - pPlugin->InitIdentity(); + if (pPlugin->GetStatus() == Plugin_Created) { APLRes result = pPlugin->Call_AskPluginLoad(error, maxlength); switch (result) { @@ -1242,6 +1230,28 @@ bool CPluginManager::LoadOrRequireExtensions(CPlugin *pPlugin, unsigned int pass return true; } +CPlugin *CPluginManager::CompileAndPrep(const char *path, char *error, size_t maxlength) +{ + CPlugin *plugin = CPlugin::CreatePlugin(path, error, maxlength); + if (plugin->GetStatus() != Plugin_Uncompiled) { + assert(plugin->GetStatus() == Plugin_BadLoad); + return plugin; + } + + if (!plugin->TryCompile(error, maxlength)) + return plugin; + assert(plugin->GetStatus() == Plugin_Created); + + if (!MalwareCheckPass(plugin, error, maxlength)) + return false; + assert(plugin->GetStatus() == Plugin_Created); + + g_ShareSys.BindNativesToPlugin(plugin, true); + plugin->InitIdentity(); + return plugin; +} + + bool CPluginManager::MalwareCheckPass(CPlugin *pPlugin, char *error, size_t maxlength) { unsigned char *pCodeHash = pPlugin->GetRuntime()->GetCodeHash(); diff --git a/core/logic/PluginSys.h b/core/logic/PluginSys.h index 6f77929f..88f8e60b 100644 --- a/core/logic/PluginSys.h +++ b/core/logic/PluginSys.h @@ -462,6 +462,7 @@ private: /** * First pass for loading a plugin, and its helpers. */ + CPlugin *CompileAndPrep(const char *path, char *error, size_t maxlength); bool MalwareCheckPass(CPlugin *pPlugin, char *error, size_t maxlength); /**