]> git.hungrycats.org Git - linux/commitdiff
[PATCH] lsm: Early init for security modules (1/4)
authorChris Wright <chris@wirex.com>
Fri, 13 Jun 2003 11:27:01 +0000 (04:27 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 13 Jun 2003 11:27:01 +0000 (04:27 -0700)
As discussed before, this allows for early initialization of security
modules when compiled statically into the kernel.  The standard
do_initcalls is too late for complete coverage of all filesystems and
threads, for example.

26 files changed:
arch/alpha/vmlinux.lds.S
arch/arm/vmlinux-armo.lds.in
arch/arm/vmlinux-armv.lds.in
arch/cris/vmlinux.lds.S
arch/h8300/platform/h8300h/generic/rom.ld
arch/i386/vmlinux.lds.S
arch/ia64/vmlinux.lds.S
arch/m68k/vmlinux-std.lds
arch/m68k/vmlinux-sun3.lds
arch/m68knommu/vmlinux.lds.S
arch/mips/vmlinux.lds.S
arch/mips64/vmlinux.lds.S
arch/parisc/vmlinux.lds.S
arch/ppc/vmlinux.lds.S
arch/ppc64/vmlinux.lds.S
arch/s390/vmlinux.lds.S
arch/sh/vmlinux.lds.S
arch/sparc/vmlinux.lds.S
arch/sparc64/vmlinux.lds.S
arch/x86_64/vmlinux.lds.S
include/asm-generic/vmlinux.lds.h
include/linux/init.h
init/main.c
security/capability.c
security/root_plug.c
security/security.c

index 863e60644e83c8553ea0b1e13ede49ddece54478..7afd00d5d46bee0af89de6fafade9d9e835107a7 100644 (file)
@@ -74,6 +74,9 @@ SECTIONS
        __con_initcall_end = .;
   }
 
+  . = ALIGN(8);
+  SECURITY_INIT
+
   . = ALIGN(64);
   __per_cpu_start = .;
   .data.percpu : { *(.data.percpu) }
index 18e100b67d67c1991be949649853cf211a0b5545..7fc51a94a94207f8e64718d2f045d11b68151579 100644 (file)
@@ -43,6 +43,7 @@ SECTIONS
                __con_initcall_start = .;
                        *(.con_initcall.init)
                __con_initcall_end = .;
+               SECURITY_INIT
                . = ALIGN(32768);
                __init_end = .;
        }
index d43fee522ecf2a2a91359efad4b3f313787eb238..0c84ec53264761cd8a2ec5dd5d943a9bef20e0ee 100644 (file)
@@ -53,6 +53,7 @@ SECTIONS
                __con_initcall_start = .;
                        *(.con_initcall.init)
                __con_initcall_end = .;
+               SECURITY_INIT
                . = ALIGN(32);
                __initramfs_start = .;
                        usr/built-in.o(.init.ramfs)
index 541857dd070dbc7b2254f5bcd00ce545b26ae590..3a5f1a36da389f87096b229bffee6f327f003115 100644 (file)
@@ -74,7 +74,12 @@ SECTIONS
                __con_initcall_start = .;
                *(.con_initcall.init)
                __con_initcall_end = .;
-       
+       }
+       .security_initcall.init : {
+               __security_initcall_start = .;
+               *(.security_initcall.init)
+               __security_initcall_end = .;
+
                /* We fill to the next page, so we can discard all init
                   pages without needing to consider what payload might be
                   appended to the kernel image.  */
index 5453fe42b586068562cbf8ff36808d9090746a30..412d9006f2ead01c54793f4ec18f6f0fc68fc2cd 100644 (file)
@@ -83,6 +83,7 @@ SECTIONS
        ___con_initcall_start = .;
                *(.con_initcall.init)
        ___con_initcall_end = .;
+       SECURITY_INIT
                . = ALIGN(4);
        ___initramfs_start = .;
                *(.init.ramfs)
index 5f024651c44afceab67e0c6973abbb0b29fb20dd..fb1ef98b8c25cdb0557573ba4e797f1f38bf4b24 100644 (file)
@@ -81,6 +81,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4);
   __alt_instructions = .;
   .altinstructions : { *(.altinstructions) } 
index fc52b7b576266ed2a27b191d43bd1e9727b1d7d3..3d9f69fefaa3ef873bfee561efee0d48fa5f9b0f 100644 (file)
@@ -141,6 +141,10 @@ SECTIONS
   .con_initcall.init : AT(ADDR(.con_initcall.init) - PAGE_OFFSET)
        { *(.con_initcall.init) }
   __con_initcall_end = .;
+  __security_initcall_start = .;
+  .security_initcall.init : AT(ADDR(.security_initcall.init) - PAGE_OFFSET)
+       { *(.security_initcall.init) }
+  __security_initcall_end = .;
   . = ALIGN(PAGE_SIZE);
   __init_end = .;
 
index 959c6ae414303741b9538769d30a80e0a6295429..bd41fc9921694dbe67c945b5541ece50ec753772 100644 (file)
@@ -67,6 +67,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(8192);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
index 03ada554c074de7b424e7fbfada28f184ec1400e..2e81cde14987105635c800e1b3d157a7047befa7 100644 (file)
@@ -61,6 +61,7 @@ __init_begin = .;
        __con_initcall_start = .;
        .con_initcall.init : { *(.con_initcall.init) }
        __con_initcall_end = .;
+       SECURITY_INIT
        . = ALIGN(8192);
        __initramfs_start = .;
        .init.ramfs : { *(.init.ramfs) }
index 1ab8a31ef9645c2e291b7cb83f3df7af4b80df00..fa2004ada4ba99ec73f4f6c7c797c0b351d8731b 100644 (file)
@@ -277,9 +277,7 @@ SECTIONS {
                __con_initcall_start = .;
                *(.con_initcall.init)
                __con_initcall_end = .;
-               __security_initcall_start = .;
-               *(.security_initcall.init)
-               __security_initcall_end = .;
+               SECURITY_INIT
                . = ALIGN(4);
                __initramfs_start = .;
                *(.init.ramfs)
index edf922683c41c00de829e7a6c5d5d837e617ce88..328e87a5faceaccd9b67520fbea9dd9744a82aa1 100644 (file)
@@ -54,6 +54,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4096);     /* Align double page for init_task_union */
   __init_end = .;
 
index fe42ea894f530cae121b433c7087d56fd597f699..89bf58aa67bd62c816fa3534887d5035951e2b3d 100644 (file)
@@ -53,6 +53,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4096);     /* Align double page for init_task_union */
   __init_end = .;
 
index 99db5cb1cc56efdf9e49bd267a745aed52ad4c13..32c089a36c9ca4a5e1b7a99c414a102071960493 100644 (file)
@@ -80,6 +80,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
index a682eccfa0dd1c989131cde05013f8d838892f7e..467b859c42660d1097431c7394cee050a505f3da 100644 (file)
@@ -119,6 +119,8 @@ SECTIONS
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
 
+  SECURITY_INIT
+
   __start___ftr_fixup = .;
   __ftr_fixup : { *(__ftr_fixup) }
   __stop___ftr_fixup = .;
index f6429d5d13c023405af8f07ee179083310bece7d..8ce3e03d23e662a139a51e991c651825422b3fdf 100644 (file)
@@ -104,6 +104,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
index db6140c6b30a483b16eb9e7bab85bac51a8227b7..bf599bab85e15232c15ef67dfe13bcc7197826f3 100644 (file)
@@ -94,6 +94,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(256);
   __initramfs_start = .;
   .init.ramfs : { *(.init.initramfs) }
index f618f3b439006f3d13a0ec5022833efea09fb503..a4c0869ac3e1cbe4aa9a80a656587cf84c31de59 100644 (file)
@@ -71,6 +71,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   __machvec_start = .;
   .machvec.init : { *(.machvec.init) }
   __machvec_end = .;
index 40fbec8537e29c89a349b7b6361c5674b1d0b2b9..0862360d865d54dc6a9ad44c405d6703d6bdad79 100644 (file)
@@ -62,6 +62,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
index 0c8919aa9f87245c5216ebb169dacf1cb95443df..ad95e88a3cbcf04761564f88b84e47ba82ca8d90 100644 (file)
@@ -68,6 +68,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(8192); 
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
index 2ad9f0e9f90d6e92dedb62538172000e348af15d..36deddcc9b47f9bf6c554ae39469382e7cce21dc 100644 (file)
@@ -105,6 +105,7 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  SECURITY_INIT
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
index 0f09f5b73a699a6d888f1c8b56251f151544665f..59c2b950e8b83fc848d4f443a8393ace1d1ba5ec 100644 (file)
@@ -45,3 +45,9 @@
                *(__ksymtab_strings)                                    \
        }
 
+#define SECURITY_INIT                                                  \
+       .security_initcall.init : {                                     \
+               __security_initcall_start = .;                          \
+               *(.security_initcall.init)                              \
+               __security_initcall_end = .;                            \
+       }
index ea0c7559adb7c0704bd495ff993d5af078a68a8f..64d4fdf7a77de7877a35cd0f7bc5bde55c52022b 100644 (file)
@@ -64,6 +64,7 @@ typedef int (*initcall_t)(void);
 typedef void (*exitcall_t)(void);
 
 extern initcall_t __con_initcall_start, __con_initcall_end;
+extern initcall_t __security_initcall_start, __security_initcall_end;
 #endif
   
 #ifndef MODULE
@@ -96,6 +97,9 @@ extern initcall_t __con_initcall_start, __con_initcall_end;
 #define console_initcall(fn) \
        static initcall_t __initcall_##fn __attribute__ ((unused,__section__ (".con_initcall.init")))=fn
 
+#define security_initcall(fn) \
+       static initcall_t __initcall_##fn __attribute__ ((unused,__section__ (".security_initcall.init"))) = fn
+
 struct obs_kernel_param {
        const char *str;
        int (*setup_func)(char *);
@@ -143,6 +147,8 @@ struct obs_kernel_param {
 #define device_initcall(fn)            module_init(fn)
 #define late_initcall(fn)              module_init(fn)
 
+#define security_initcall(fn)          module_init(fn)
+
 /* These macros create a dummy inline: gcc 2.9x does not count alias
  as usage, hence the `unused function' warning when __init functions
  are declared static. We use the dummy __*_module_inline functions
index e80b5d321abe0d3ca231645e5f8268e451973a5f..4774a4bee2fb45a580281664ab67367f200cddbc 100644 (file)
@@ -439,8 +439,8 @@ asmlinkage void __init start_kernel(void)
        pte_chain_init();
        fork_init(num_physpages);
        proc_caches_init();
-       security_scaffolding_startup();
        buffer_init();
+       security_scaffolding_startup();
        vfs_caches_init(num_physpages);
        radix_tree_init();
        signals_init();
index 02cb4112fce019ff7685c5b5b6ca49b5dfd20381..9b2b9862d03564c53f0336687aaf05c59d1d8cad 100644 (file)
@@ -348,7 +348,7 @@ static void __exit capability_exit (void)
        }
 }
 
-module_init (capability_init);
+security_initcall (capability_init);
 module_exit (capability_exit);
 
 MODULE_DESCRIPTION("Standard Linux Capabilities Security Module");
index d705d43305c98166e939e2704ff2d91ac63df81d..73ee98192b3aba5f666304df02b74c8909c3f3ca 100644 (file)
@@ -135,7 +135,7 @@ static void __exit rootplug_exit (void)
        printk (KERN_INFO "Root Plug module removed\n");
 }
 
-module_init (rootplug_init);
+security_initcall (rootplug_init);
 module_exit (rootplug_exit);
 
 MODULE_DESCRIPTION("Root Plug sample LSM module, written for Linux Journal article");
index 4ea82dbc60b4ec82cd9827f324db42b6ba5ff8d9..0fb1ad99cd3cd791a202b2bb0d07d3d03091b201 100644 (file)
@@ -38,12 +38,22 @@ static inline int verify (struct security_operations *ops)
        return 0;
 }
 
+static void __init do_security_initcalls(void)
+{
+       initcall_t *call;
+       call = &__security_initcall_start;
+       while (call < &__security_initcall_end) {
+               (*call)();
+               call++;
+       }
+}
+
 /**
  * security_scaffolding_startup - initialzes the security scaffolding framework
  *
  * This should be called early in the kernel initialization sequence.
  */
-int security_scaffolding_startup (void)
+int __init security_scaffolding_startup (void)
 {
        printk (KERN_INFO "Security Scaffold v" SECURITY_SCAFFOLD_VERSION
                " initialized\n");
@@ -55,6 +65,7 @@ int security_scaffolding_startup (void)
        }
 
        security_ops = &dummy_security_ops;
+       do_security_initcalls();
 
        return 0;
 }