|
@@ -15,16 +15,20 @@
|
|
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
|
|
|
|
+#include <linux/rculist.h>
|
|
#include "ima.h"
|
|
#include "ima.h"
|
|
#include "ima_template_lib.h"
|
|
#include "ima_template_lib.h"
|
|
|
|
|
|
-static struct ima_template_desc defined_templates[] = {
|
|
|
|
|
|
+static struct ima_template_desc builtin_templates[] = {
|
|
{.name = IMA_TEMPLATE_IMA_NAME, .fmt = IMA_TEMPLATE_IMA_FMT},
|
|
{.name = IMA_TEMPLATE_IMA_NAME, .fmt = IMA_TEMPLATE_IMA_FMT},
|
|
{.name = "ima-ng", .fmt = "d-ng|n-ng"},
|
|
{.name = "ima-ng", .fmt = "d-ng|n-ng"},
|
|
{.name = "ima-sig", .fmt = "d-ng|n-ng|sig"},
|
|
{.name = "ima-sig", .fmt = "d-ng|n-ng|sig"},
|
|
{.name = "", .fmt = ""}, /* placeholder for a custom format */
|
|
{.name = "", .fmt = ""}, /* placeholder for a custom format */
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static LIST_HEAD(defined_templates);
|
|
|
|
+static DEFINE_SPINLOCK(template_list);
|
|
|
|
+
|
|
static struct ima_template_field supported_fields[] = {
|
|
static struct ima_template_field supported_fields[] = {
|
|
{.field_id = "d", .field_init = ima_eventdigest_init,
|
|
{.field_id = "d", .field_init = ima_eventdigest_init,
|
|
.field_show = ima_show_template_digest},
|
|
.field_show = ima_show_template_digest},
|
|
@@ -53,6 +57,8 @@ static int __init ima_template_setup(char *str)
|
|
if (ima_template)
|
|
if (ima_template)
|
|
return 1;
|
|
return 1;
|
|
|
|
|
|
|
|
+ ima_init_template_list();
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Verify that a template with the supplied name exists.
|
|
* Verify that a template with the supplied name exists.
|
|
* If not, use CONFIG_IMA_DEFAULT_TEMPLATE.
|
|
* If not, use CONFIG_IMA_DEFAULT_TEMPLATE.
|
|
@@ -81,7 +87,7 @@ __setup("ima_template=", ima_template_setup);
|
|
|
|
|
|
static int __init ima_template_fmt_setup(char *str)
|
|
static int __init ima_template_fmt_setup(char *str)
|
|
{
|
|
{
|
|
- int num_templates = ARRAY_SIZE(defined_templates);
|
|
|
|
|
|
+ int num_templates = ARRAY_SIZE(builtin_templates);
|
|
|
|
|
|
if (ima_template)
|
|
if (ima_template)
|
|
return 1;
|
|
return 1;
|
|
@@ -92,22 +98,28 @@ static int __init ima_template_fmt_setup(char *str)
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
- defined_templates[num_templates - 1].fmt = str;
|
|
|
|
- ima_template = defined_templates + num_templates - 1;
|
|
|
|
|
|
+ builtin_templates[num_templates - 1].fmt = str;
|
|
|
|
+ ima_template = builtin_templates + num_templates - 1;
|
|
|
|
+
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
__setup("ima_template_fmt=", ima_template_fmt_setup);
|
|
__setup("ima_template_fmt=", ima_template_fmt_setup);
|
|
|
|
|
|
static struct ima_template_desc *lookup_template_desc(const char *name)
|
|
static struct ima_template_desc *lookup_template_desc(const char *name)
|
|
{
|
|
{
|
|
- int i;
|
|
|
|
|
|
+ struct ima_template_desc *template_desc;
|
|
|
|
+ int found = 0;
|
|
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(defined_templates); i++) {
|
|
|
|
- if (strcmp(defined_templates[i].name, name) == 0)
|
|
|
|
- return defined_templates + i;
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ list_for_each_entry_rcu(template_desc, &defined_templates, list) {
|
|
|
|
+ if ((strcmp(template_desc->name, name) == 0) ||
|
|
|
|
+ (strcmp(template_desc->fmt, name) == 0)) {
|
|
|
|
+ found = 1;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-
|
|
|
|
- return NULL;
|
|
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+ return found ? template_desc : NULL;
|
|
}
|
|
}
|
|
|
|
|
|
static struct ima_template_field *lookup_template_field(const char *field_id)
|
|
static struct ima_template_field *lookup_template_field(const char *field_id)
|
|
@@ -183,11 +195,28 @@ static int template_desc_init_fields(const char *template_fmt,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ima_init_template_list(void)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ if (!list_empty(&defined_templates))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ spin_lock(&template_list);
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(builtin_templates); i++) {
|
|
|
|
+ list_add_tail_rcu(&builtin_templates[i].list,
|
|
|
|
+ &defined_templates);
|
|
|
|
+ }
|
|
|
|
+ spin_unlock(&template_list);
|
|
|
|
+}
|
|
|
|
+
|
|
struct ima_template_desc *ima_template_desc_current(void)
|
|
struct ima_template_desc *ima_template_desc_current(void)
|
|
{
|
|
{
|
|
- if (!ima_template)
|
|
|
|
|
|
+ if (!ima_template) {
|
|
|
|
+ ima_init_template_list();
|
|
ima_template =
|
|
ima_template =
|
|
lookup_template_desc(CONFIG_IMA_DEFAULT_TEMPLATE);
|
|
lookup_template_desc(CONFIG_IMA_DEFAULT_TEMPLATE);
|
|
|
|
+ }
|
|
return ima_template;
|
|
return ima_template;
|
|
}
|
|
}
|
|
|
|
|