diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-13 12:48:54 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-13 12:48:54 -0400 |
| commit | ddbf9ef385bfbef897210733abfb73cb9b94ecec (patch) | |
| tree | 64a9e965a71eef13e813a3327f8d74aa7168ee19 | |
| parent | 5d54e69c68c05b162a56f9914cae72afd7e6f40a (diff) | |
| parent | 2c40579bdc2a94977fcff2521d5b53a97c33e77a (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6
| -rw-r--r-- | include/linux/security.h | 5 | ||||
| -rw-r--r-- | security/Kconfig | 1 | ||||
| -rw-r--r-- | security/Makefile | 2 | ||||
| -rw-r--r-- | security/inode.c | 347 | ||||
| -rw-r--r-- | security/seclvl.c | 228 |
5 files changed, 424 insertions, 159 deletions
diff --git a/include/linux/security.h b/include/linux/security.h index 55b02e1c73f4..0e43460d374e 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -1907,6 +1907,11 @@ extern int register_security (struct security_operations *ops); | |||
| 1907 | extern int unregister_security (struct security_operations *ops); | 1907 | extern int unregister_security (struct security_operations *ops); |
| 1908 | extern int mod_reg_security (const char *name, struct security_operations *ops); | 1908 | extern int mod_reg_security (const char *name, struct security_operations *ops); |
| 1909 | extern int mod_unreg_security (const char *name, struct security_operations *ops); | 1909 | extern int mod_unreg_security (const char *name, struct security_operations *ops); |
| 1910 | extern struct dentry *securityfs_create_file(const char *name, mode_t mode, | ||
| 1911 | struct dentry *parent, void *data, | ||
| 1912 | struct file_operations *fops); | ||
| 1913 | extern struct dentry *securityfs_create_dir(const char *name, struct dentry *parent); | ||
| 1914 | extern void securityfs_remove(struct dentry *dentry); | ||
| 1910 | 1915 | ||
| 1911 | 1916 | ||
| 1912 | #else /* CONFIG_SECURITY */ | 1917 | #else /* CONFIG_SECURITY */ |
diff --git a/security/Kconfig b/security/Kconfig index dcf04a09185d..64d3f1e9ca85 100644 --- a/security/Kconfig +++ b/security/Kconfig | |||
| @@ -35,6 +35,7 @@ config KEYS_DEBUG_PROC_KEYS | |||
| 35 | 35 | ||
| 36 | config SECURITY | 36 | config SECURITY |
| 37 | bool "Enable different security models" | 37 | bool "Enable different security models" |
| 38 | depends on SYSFS | ||
| 38 | help | 39 | help |
| 39 | This allows you to choose different security modules to be | 40 | This allows you to choose different security modules to be |
| 40 | configured into your kernel. | 41 | configured into your kernel. |
diff --git a/security/Makefile b/security/Makefile index 197cc2f3f1ec..8cbbf2f36709 100644 --- a/security/Makefile +++ b/security/Makefile | |||
| @@ -11,7 +11,7 @@ obj-y += commoncap.o | |||
| 11 | endif | 11 | endif |
| 12 | 12 | ||
| 13 | # Object file lists | 13 | # Object file lists |
| 14 | obj-$(CONFIG_SECURITY) += security.o dummy.o | 14 | obj-$(CONFIG_SECURITY) += security.o dummy.o inode.o |
| 15 | # Must precede capability.o in order to stack properly. | 15 | # Must precede capability.o in order to stack properly. |
| 16 | obj-$(CONFIG_SECURITY_SELINUX) += selinux/built-in.o | 16 | obj-$(CONFIG_SECURITY_SELINUX) += selinux/built-in.o |
| 17 | obj-$(CONFIG_SECURITY_CAPABILITIES) += commoncap.o capability.o | 17 | obj-$(CONFIG_SECURITY_CAPABILITIES) += commoncap.o capability.o |
diff --git a/security/inode.c b/security/inode.c new file mode 100644 index 000000000000..a5964502ae30 --- /dev/null +++ b/security/inode.c | |||
| @@ -0,0 +1,347 @@ | |||
| 1 | /* | ||
| 2 | * inode.c - securityfs | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License version | ||
| 8 | * 2 as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * Based on fs/debugfs/inode.c which had the following copyright notice: | ||
| 11 | * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com> | ||
| 12 | * Copyright (C) 2004 IBM Inc. | ||
| 13 | */ | ||
| 14 | |||
| 15 | /* #define DEBUG */ | ||
| 16 | #include <linux/config.h> | ||
| 17 | #include <linux/module.h> | ||
| 18 | #include <linux/fs.h> | ||
| 19 | #include <linux/mount.h> | ||
| 20 | #include <linux/pagemap.h> | ||
| 21 | #include <linux/init.h> | ||
| 22 | #include <linux/namei.h> | ||
| 23 | #include <linux/security.h> | ||
| 24 | |||
| 25 | #define SECURITYFS_MAGIC 0x73636673 | ||
| 26 | |||
| 27 | static struct vfsmount *mount; | ||
| 28 | static int mount_count; | ||
| 29 | |||
| 30 | /* | ||
| 31 | * TODO: | ||
| 32 | * I think I can get rid of these default_file_ops, but not quite sure... | ||
| 33 | */ | ||
| 34 | static ssize_t default_read_file(struct file *file, char __user *buf, | ||
| 35 | size_t count, loff_t *ppos) | ||
| 36 | { | ||
| 37 | return 0; | ||
| 38 | } | ||
| 39 | |||
| 40 | static ssize_t default_write_file(struct file *file, const char __user *buf, | ||
| 41 | size_t count, loff_t *ppos) | ||
| 42 | { | ||
| 43 | return count; | ||
| 44 | } | ||
| 45 | |||
| 46 | static int default_open(struct inode *inode, struct file *file) | ||
| 47 | { | ||
| 48 | if (inode->u.generic_ip) | ||
| 49 | file->private_data = inode->u.generic_ip; | ||
| 50 | |||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | |||
| 54 | static struct file_operations default_file_ops = { | ||
| 55 | .read = default_read_file, | ||
| 56 | .write = default_write_file, | ||
| 57 | .open = default_open, | ||
| 58 | }; | ||
| 59 | |||
| 60 | static struct inode *get_inode(struct super_block *sb, int mode, dev_t dev) | ||
| 61 | { | ||
| 62 | struct inode *inode = new_inode(sb); | ||
| 63 | |||
| 64 | if (inode) { | ||
| 65 | inode->i_mode = mode; | ||
| 66 | inode->i_uid = 0; | ||
| 67 | inode->i_gid = 0; | ||
| 68 | inode->i_blksize = PAGE_CACHE_SIZE; | ||
| 69 | inode->i_blocks = 0; | ||
| 70 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
| 71 | switch (mode & S_IFMT) { | ||
| 72 | default: | ||
| 73 | init_special_inode(inode, mode, dev); | ||
| 74 | break; | ||
| 75 | case S_IFREG: | ||
| 76 | inode->i_fop = &default_file_ops; | ||
| 77 | break; | ||
| 78 | case S_IFDIR: | ||
| 79 | inode->i_op = &simple_dir_inode_operations; | ||
| 80 | inode->i_fop = &simple_dir_operations; | ||
| 81 | |||
| 82 | /* directory inodes start off with i_nlink == 2 (for "." entry) */ | ||
| 83 | inode->i_nlink++; | ||
| 84 | break; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | return inode; | ||
| 88 | } | ||
| 89 | |||
| 90 | /* SMP-safe */ | ||
| 91 | static int mknod(struct inode *dir, struct dentry *dentry, | ||
| 92 | int mode, dev_t dev) | ||
| 93 | { | ||
| 94 | struct inode *inode; | ||
| 95 | int error = -EPERM; | ||
| 96 | |||
| 97 | if (dentry->d_inode) | ||
| 98 | return -EEXIST; | ||
| 99 | |||
| 100 | inode = get_inode(dir->i_sb, mode, dev); | ||
| 101 | if (inode) { | ||
| 102 | d_instantiate(dentry, inode); | ||
| 103 | dget(dentry); | ||
| 104 | error = 0; | ||
| 105 | } | ||
| 106 | return error; | ||
| 107 | } | ||
| 108 | |||
| 109 | static int mkdir(struct inode *dir, struct dentry *dentry, int mode) | ||
| 110 | { | ||
| 111 | int res; | ||
| 112 | |||
| 113 | mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR; | ||
| 114 | res = mknod(dir, dentry, mode, 0); | ||
| 115 | if (!res) | ||
| 116 | dir->i_nlink++; | ||
| 117 | return res; | ||
| 118 | } | ||
| 119 | |||
| 120 | static int create(struct inode *dir, struct dentry *dentry, int mode) | ||
| 121 | { | ||
| 122 | mode = (mode & S_IALLUGO) | S_IFREG; | ||
| 123 | return mknod(dir, dentry, mode, 0); | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline int positive(struct dentry *dentry) | ||
| 127 | { | ||
| 128 | return dentry->d_inode && !d_unhashed(dentry); | ||
| 129 | } | ||
| 130 | |||
| 131 | static int fill_super(struct super_block *sb, void *data, int silent) | ||
| 132 | { | ||
| 133 | static struct tree_descr files[] = {{""}}; | ||
| 134 | |||
| 135 | return simple_fill_super(sb, SECURITYFS_MAGIC, files); | ||
| 136 | } | ||
| 137 | |||
| 138 | static struct super_block *get_sb(struct file_system_type *fs_type, | ||
| 139 | int flags, const char *dev_name, | ||
| 140 | void *data) | ||
| 141 | { | ||
| 142 | return get_sb_single(fs_type, flags, data, fill_super); | ||
| 143 | } | ||
| 144 | |||
| 145 | static struct file_system_type fs_type = { | ||
| 146 | .owner = THIS_MODULE, | ||
| 147 | .name = "securityfs", | ||
| 148 | .get_sb = get_sb, | ||
| 149 | .kill_sb = kill_litter_super, | ||
| 150 | }; | ||
| 151 | |||
| 152 | static int create_by_name(const char *name, mode_t mode, | ||
| 153 | struct dentry *parent, | ||
| 154 | struct dentry **dentry) | ||
| 155 | { | ||
| 156 | int error = 0; | ||
| 157 | |||
