Skip to content

Commit

Permalink
LSM: Convert from initcall to struct lsm_info
Browse files Browse the repository at this point in the history
In preparation for doing more interesting LSM init probing, this converts
the existing initcall system into an explicit call into a function pointer
from a section-collected struct lsm_info array.

Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Casey Schaufler <casey@schaufler-ca.com>
Reviewed-by: James Morris <james.morris@microsoft.com>
Reviewed-by: John Johansen <john.johansen@canonical.com>
Signed-off-by: James Morris <james.morris@microsoft.com>
  • Loading branch information
Kees Cook authored and James Morris committed Oct 11, 2018
1 parent 6907e37 commit 5b89c1b
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 12 deletions.
2 changes: 0 additions & 2 deletions include/linux/init.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@ static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
#endif

extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
extern initcall_entry_t __start_lsm_info[], __end_lsm_info[];

/* Used for contructor calls. */
typedef void (*ctor_fn_t)(void);
Expand Down Expand Up @@ -236,7 +235,6 @@ extern bool initcall_debug;
static exitcall_t __exitcall_##fn __exit_call = fn

#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
#define security_initcall(fn) ___define_initcall(fn,, .lsm_info)

struct obs_kernel_param {
const char *str;
Expand Down
12 changes: 12 additions & 0 deletions include/linux/lsm_hooks.h
Original file line number Diff line number Diff line change
Expand Up @@ -2039,6 +2039,18 @@ extern char *lsm_names;
extern void security_add_hooks(struct security_hook_list *hooks, int count,
char *lsm);

struct lsm_info {
int (*init)(void); /* Required. */
};

extern struct lsm_info __start_lsm_info[], __end_lsm_info[];

#define security_initcall(lsm) \
static struct lsm_info __lsm_##lsm \
__used __section(.lsm_info.init) \
__aligned(sizeof(unsigned long)) \
= { .init = lsm, }

#ifdef CONFIG_SECURITY_SELINUX_DISABLE
/*
* Assuring the safety of deleting a security module is up to
Expand Down
1 change: 0 additions & 1 deletion include/linux/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ extern void cleanup_module(void);
#define late_initcall_sync(fn) module_init(fn)

#define console_initcall(fn) module_init(fn)
#define security_initcall(fn) module_init(fn)

/* Each module must use one module_init(). */
#define module_init(initfn) \
Expand Down
1 change: 1 addition & 0 deletions security/integrity/iint.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <linux/file.h>
#include <linux/uaccess.h>
#include <linux/security.h>
#include <linux/lsm_hooks.h>
#include "integrity.h"

static struct rb_root integrity_iint_tree = RB_ROOT;
Expand Down
14 changes: 5 additions & 9 deletions security/security.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,12 @@ char *lsm_names;
static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
CONFIG_DEFAULT_SECURITY;

static void __init do_security_initcalls(void)
static void __init major_lsm_init(void)
{
initcall_t call;
initcall_entry_t *ce;
struct lsm_info *lsm;

ce = __start_lsm_info;
while (ce < __end_lsm_info) {
call = initcall_from_entry(ce);
call();
ce++;
for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
lsm->init();
}
}

Expand Down Expand Up @@ -82,7 +78,7 @@ int __init security_init(void)
/*
* Load all the remaining security modules.
*/
do_security_initcalls();
major_lsm_init();

return 0;
}
Expand Down

0 comments on commit 5b89c1b

Please sign in to comment.