diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-02-04 16:34:38 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-02-04 16:34:38 +0100 |
commit | f42baa45204bfb1df7219242d7ebcc102ad494be (patch) | |
tree | 6223e0ed59606600b0a8fda44aba68fc08c9a903 /src | |
parent | 79addff9cdee1c91d42ce656124bd5159e118159 (diff) | |
download | abrt-f42baa45204bfb1df7219242d7ebcc102ad494be.tar.gz abrt-f42baa45204bfb1df7219242d7ebcc102ad494be.tar.xz abrt-f42baa45204bfb1df7219242d7ebcc102ad494be.zip |
abrtd: fix rhbz#560642 - don't die on bad plugin names
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/Daemon/ABRTPlugin.cpp | 46 | ||||
-rw-r--r-- | src/Daemon/ABRTPlugin.h | 161 | ||||
-rw-r--r-- | src/Daemon/Makefile.am | 1 | ||||
-rw-r--r-- | src/Daemon/PluginManager.cpp | 63 | ||||
-rw-r--r-- | src/Daemon/PluginManager.h | 3 |
5 files changed, 58 insertions, 216 deletions
diff --git a/src/Daemon/ABRTPlugin.cpp b/src/Daemon/ABRTPlugin.cpp deleted file mode 100644 index eb0b50d9..00000000 --- a/src/Daemon/ABRTPlugin.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - ABRTPlugin.cpp - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "abrtlib.h" -#include "ABRTPlugin.h" -#include <dlfcn.h> - -CLoadedModule::CLoadedModule(const char* pLibPath) -{ - /* All errors are fatal */ - m_pHandle = dlopen(pLibPath, RTLD_NOW); - if (!m_pHandle) - error_msg_and_die("can't load '%s': %s", pLibPath, dlerror()); - -#define LOADSYM(fp, handle, name) do { \ - fp = (typeof(fp)) (dlsym(handle, name)); \ - if (!fp) \ - error_msg_and_die("'%s' has no %s entry", pLibPath, name); \ -} while (0) - - LOADSYM(m_pPluginInfo, m_pHandle, "plugin_info"); - LOADSYM(m_pFnPluginNew, m_pHandle, "plugin_new"); -} - -CLoadedModule::~CLoadedModule() -{ - dlclose(m_pHandle); -} diff --git a/src/Daemon/ABRTPlugin.h b/src/Daemon/ABRTPlugin.h deleted file mode 100644 index 57d87f05..00000000 --- a/src/Daemon/ABRTPlugin.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - ABRTPlugin.h - header file for abrt plugin. - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - - -#ifndef ABRTPLUGIN_H_ -#define ABRTPLUGIN_H_ - -#include <string> -#include "Plugin.h" - -/** - * CLoadedModule class. A class which contains a loaded plugin. - */ -class CLoadedModule -{ - private: - /** - * dlopen'ed library - */ - void* m_pHandle; - /** - * A pointer to struc containing information about plugin. - */ - const plugin_info_t* m_pPluginInfo; - /** - * A pointer to function, which creates new instances of plugin. - */ - CPlugin* (*m_pFnPluginNew)(); - - public: - /** - * A constructor. - * The constructor loads a plugin - * @param pLibPath a path to a plugin - */ - CLoadedModule(const char* pLibPath); - /** - * A destructor. - */ - ~CLoadedModule(); - /** - * It is used for getting loaded plugin's version. - * @return plugin version - */ - const char* GetVersion(); - /** - * It is used for getting loaded plugin's magic number. - * @return magic number - */ - int GetMagicNumber(); - /** - * It is used for getting loaded plugin's name. - * @return magic number - */ - const char* GetName(); - /** - * It is used for getting loaded plugin's description. - * @return magic number - */ - const char* GetDescription(); - /** - * It is used for getting an author email of loaded plugin. - * @return description - */ - const char* GetEmail(); - /** - * It is used for getting a home page of loaded plugin. - * @return home page - */ - const char* GetWWW(); - /** - * It is used for getting a path to gui description. - * @return home page - */ - const char* GetGTKBuilder(); - /** - * It is used for getting loaded plugin's type. - * @return type - */ - plugin_type_t GetType(); - /** - * It is used fot getting of a new instance of loaded plugin - * @return pointer to new allocated instance of plugin. A caller - * has to delete it. - */ - CPlugin* PluginNew(); -}; - -inline -const char* CLoadedModule::GetVersion() -{ - return m_pPluginInfo->m_sVersion; -} - -inline -int CLoadedModule::GetMagicNumber() -{ - return m_pPluginInfo->m_nMagicNumber; -} - -inline -const char* CLoadedModule::GetName() -{ - return m_pPluginInfo->m_sName; -} - -inline -const char* CLoadedModule::GetDescription() -{ - return m_pPluginInfo->m_sDescription; -} - -inline -const char* CLoadedModule::GetEmail() -{ - return m_pPluginInfo->m_sEmail; -} - -inline -const char* CLoadedModule::GetWWW() -{ - return m_pPluginInfo->m_sWWW; -} - -inline -const char* CLoadedModule::GetGTKBuilder() -{ - return m_pPluginInfo->m_sGTKBuilder; -} - -inline -plugin_type_t CLoadedModule::GetType() -{ - return m_pPluginInfo->m_Type; -} - -inline -CPlugin* CLoadedModule::PluginNew() -{ - return m_pFnPluginNew(); -} - -#endif /*ABRTPLUGIN_H_*/ diff --git a/src/Daemon/Makefile.am b/src/Daemon/Makefile.am index 235b01b9..cb440277 100644 --- a/src/Daemon/Makefile.am +++ b/src/Daemon/Makefile.am @@ -4,7 +4,6 @@ sbin_PROGRAMS = abrtd # disabled: CommLayerServerSocket.h CommLayerServerSocket.cpp abrtd_SOURCES = \ - ABRTPlugin.h ABRTPlugin.cpp \ PluginManager.h PluginManager.cpp \ RPM.h RPM.cpp \ MiddleWare.h MiddleWare.cpp \ diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp index 15e9bee8..5166c6a4 100644 --- a/src/Daemon/PluginManager.cpp +++ b/src/Daemon/PluginManager.cpp @@ -21,6 +21,7 @@ #include <fstream> #include <iostream> +#include <dlfcn.h> #include "abrtlib.h" #include "ABRTException.h" #include "CommLayerInner.h" @@ -29,6 +30,48 @@ using namespace std; + +/** + * CLoadedModule class. A class which contains a loaded plugin. + */ +class CLoadedModule +{ + private: + /* dlopen'ed library */ + void *m_pHandle; + const plugin_info_t *m_pPluginInfo; + CPlugin* (*m_pFnPluginNew)(); + + public: + CLoadedModule(void *handle, const char *mod_name); + ~CLoadedModule() { dlclose(m_pHandle); } + int GetMagicNumber() { return m_pPluginInfo->m_nMagicNumber; } + const char *GetVersion() { return m_pPluginInfo->m_sVersion; } + const char *GetName() { return m_pPluginInfo->m_sName; } + const char *GetDescription() { return m_pPluginInfo->m_sDescription; } + const char *GetEmail() { return m_pPluginInfo->m_sEmail; } + const char *GetWWW() { return m_pPluginInfo->m_sWWW; } + const char *GetGTKBuilder() { return m_pPluginInfo->m_sGTKBuilder; } + plugin_type_t GetType() { return m_pPluginInfo->m_Type; } + CPlugin *PluginNew() { return m_pFnPluginNew(); } +}; +CLoadedModule::CLoadedModule(void *handle, const char *mod_name) +{ + m_pHandle = handle; + /* All errors are fatal */ +#define LOADSYM(fp, handle, name) \ + do { \ + fp = (typeof(fp)) (dlsym(handle, name)); \ + if (!fp) \ + error_msg_and_die("'%s' has no %s entry", mod_name, name); \ + } while (0) + + LOADSYM(m_pPluginInfo, handle, "plugin_info"); + LOADSYM(m_pFnPluginNew, handle, "plugin_new"); +#undef LOADSYM +} + + /** * Text representation of plugin types. */ @@ -200,7 +243,13 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only) } string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName); - CLoadedModule* module = new CLoadedModule(libPath.c_str()); + void *handle = dlopen(libPath.c_str(), RTLD_NOW); + if (!handle) + { + error_msg("Can't load '%s': %s", libPath.c_str(), dlerror()); + return NULL; /* error */ + } + CLoadedModule *module = new CLoadedModule(handle, pName); if (module->GetMagicNumber() != PLUGINS_MAGIC_NUMBER || module->GetType() < 0 || module->GetType() > MAX_PLUGIN_TYPE @@ -214,7 +263,7 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only) } VERB3 log("Loaded plugin %s v.%s", pName, module->GetVersion()); - CPlugin* plugin = NULL; + CPlugin *plugin = NULL; try { plugin = module->PluginNew(); @@ -297,7 +346,7 @@ void CPluginManager::UnRegisterPluginDBUS(const char *pName, const char *pDBUSSe CAnalyzer* CPluginManager::GetAnalyzer(const char *pName) { - CPlugin* plugin = LoadPlugin(pName); + CPlugin *plugin = LoadPlugin(pName); if (!plugin) { error_msg("Plugin '%s' is not registered", pName); @@ -313,7 +362,7 @@ CAnalyzer* CPluginManager::GetAnalyzer(const char *pName) CReporter* CPluginManager::GetReporter(const char *pName) { - CPlugin* plugin = LoadPlugin(pName); + CPlugin *plugin = LoadPlugin(pName); if (!plugin) { error_msg("Plugin '%s' is not registered", pName); @@ -329,7 +378,7 @@ CReporter* CPluginManager::GetReporter(const char *pName) CAction* CPluginManager::GetAction(const char *pName, bool silent) { - CPlugin* plugin = LoadPlugin(pName); + CPlugin *plugin = LoadPlugin(pName); if (!plugin) { error_msg("Plugin '%s' is not registered", pName); @@ -346,7 +395,7 @@ CAction* CPluginManager::GetAction(const char *pName, bool silent) CDatabase* CPluginManager::GetDatabase(const char *pName) { - CPlugin* plugin = LoadPlugin(pName); + CPlugin *plugin = LoadPlugin(pName); if (!plugin) { throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName); @@ -360,7 +409,7 @@ CDatabase* CPluginManager::GetDatabase(const char *pName) plugin_type_t CPluginManager::GetPluginType(const char *pName) { - CPlugin* plugin = LoadPlugin(pName); + CPlugin *plugin = LoadPlugin(pName); if (!plugin) { throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName); diff --git a/src/Daemon/PluginManager.h b/src/Daemon/PluginManager.h index 22cc387b..8eebe7da 100644 --- a/src/Daemon/PluginManager.h +++ b/src/Daemon/PluginManager.h @@ -24,13 +24,14 @@ #define PLUGINMANAGER_H_ #include "abrt_types.h" -#include "ABRTPlugin.h" #include "Plugin.h" #include "Analyzer.h" #include "Reporter.h" #include "Database.h" #include "Action.h" +class CLoadedModule; /* opaque */ + /** * A class. It takes care of loading, registering and manipulating with * plugins. When a plugin is loaded, its library is opened, but no plugin |