aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/plugins/plugin_loader.c
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-06-18 17:50:28 +0200
committerMartin Willi <martin@strongswan.org>2009-06-22 15:47:17 +0200
commit960e0c104013207a9057e6e320b9cbf068cff013 (patch)
treeb41327bc17143129a0f1f006dd0d9f0fea65cecf /src/libstrongswan/plugins/plugin_loader.c
parent20d4fc97cf5e5663f0f4489b4ec72080b6de34a8 (diff)
downloadstrongswan-960e0c104013207a9057e6e320b9cbf068cff013.tar.bz2
strongswan-960e0c104013207a9057e6e320b9cbf068cff013.tar.xz
check integrity of plugins before loading
Diffstat (limited to 'src/libstrongswan/plugins/plugin_loader.c')
-rw-r--r--src/libstrongswan/plugins/plugin_loader.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c
index ad5a9e240..f124a8e8b 100644
--- a/src/libstrongswan/plugins/plugin_loader.c
+++ b/src/libstrongswan/plugins/plugin_loader.c
@@ -20,8 +20,10 @@
#include <dlfcn.h>
#include <limits.h>
#include <stdio.h>
+#include <link.h>
#include <debug.h>
+#include <integrity_checker.h>
#include <utils/linked_list.h>
#include <plugins/plugin.h>
@@ -61,6 +63,12 @@ static plugin_t* load_plugin(private_plugin_loader_t *this,
snprintf(file, sizeof(file), "%s/libstrongswan-%s.so", path, name);
+ if (lib->integrity &&
+ !lib->integrity->check_file(lib->integrity, name, file))
+ {
+ DBG1("file integrity test of plugin '%s' failed", name);
+ return NULL;
+ }
handle = dlopen(file, RTLD_LAZY);
if (handle == NULL)
{
@@ -74,6 +82,13 @@ static plugin_t* load_plugin(private_plugin_loader_t *this,
dlclose(handle);
return NULL;
}
+ if (lib->integrity &&
+ !lib->integrity->check_segment(lib->integrity, name, constructor))
+ {
+ DBG1("segment integrity test of plugin '%s' failed", name);
+ dlclose(handle);
+ return NULL;
+ }
plugin = constructor();
if (plugin == NULL)
{