0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/sysfs.h>
0014 #include <linux/kobject.h>
0015 #include <linux/fs.h>
0016 #include <linux/fs_context.h>
0017 #include <linux/mount.h>
0018 #include <linux/pagemap.h>
0019 #include <linux/init.h>
0020 #include <linux/namei.h>
0021 #include <linux/security.h>
0022 #include <linux/lsm_hooks.h>
0023 #include <linux/magic.h>
0024
0025 static struct vfsmount *mount;
0026 static int mount_count;
0027
0028 static void securityfs_free_inode(struct inode *inode)
0029 {
0030 if (S_ISLNK(inode->i_mode))
0031 kfree(inode->i_link);
0032 free_inode_nonrcu(inode);
0033 }
0034
0035 static const struct super_operations securityfs_super_operations = {
0036 .statfs = simple_statfs,
0037 .free_inode = securityfs_free_inode,
0038 };
0039
0040 static int securityfs_fill_super(struct super_block *sb, struct fs_context *fc)
0041 {
0042 static const struct tree_descr files[] = {{""}};
0043 int error;
0044
0045 error = simple_fill_super(sb, SECURITYFS_MAGIC, files);
0046 if (error)
0047 return error;
0048
0049 sb->s_op = &securityfs_super_operations;
0050
0051 return 0;
0052 }
0053
0054 static int securityfs_get_tree(struct fs_context *fc)
0055 {
0056 return get_tree_single(fc, securityfs_fill_super);
0057 }
0058
0059 static const struct fs_context_operations securityfs_context_ops = {
0060 .get_tree = securityfs_get_tree,
0061 };
0062
0063 static int securityfs_init_fs_context(struct fs_context *fc)
0064 {
0065 fc->ops = &securityfs_context_ops;
0066 return 0;
0067 }
0068
0069 static struct file_system_type fs_type = {
0070 .owner = THIS_MODULE,
0071 .name = "securityfs",
0072 .init_fs_context = securityfs_init_fs_context,
0073 .kill_sb = kill_litter_super,
0074 };
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 static struct dentry *securityfs_create_dentry(const char *name, umode_t mode,
0108 struct dentry *parent, void *data,
0109 const struct file_operations *fops,
0110 const struct inode_operations *iops)
0111 {
0112 struct dentry *dentry;
0113 struct inode *dir, *inode;
0114 int error;
0115
0116 if (!(mode & S_IFMT))
0117 mode = (mode & S_IALLUGO) | S_IFREG;
0118
0119 pr_debug("securityfs: creating file '%s'\n",name);
0120
0121 error = simple_pin_fs(&fs_type, &mount, &mount_count);
0122 if (error)
0123 return ERR_PTR(error);
0124
0125 if (!parent)
0126 parent = mount->mnt_root;
0127
0128 dir = d_inode(parent);
0129
0130 inode_lock(dir);
0131 dentry = lookup_one_len(name, parent, strlen(name));
0132 if (IS_ERR(dentry))
0133 goto out;
0134
0135 if (d_really_is_positive(dentry)) {
0136 error = -EEXIST;
0137 goto out1;
0138 }
0139
0140 inode = new_inode(dir->i_sb);
0141 if (!inode) {
0142 error = -ENOMEM;
0143 goto out1;
0144 }
0145
0146 inode->i_ino = get_next_ino();
0147 inode->i_mode = mode;
0148 inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
0149 inode->i_private = data;
0150 if (S_ISDIR(mode)) {
0151 inode->i_op = &simple_dir_inode_operations;
0152 inode->i_fop = &simple_dir_operations;
0153 inc_nlink(inode);
0154 inc_nlink(dir);
0155 } else if (S_ISLNK(mode)) {
0156 inode->i_op = iops ? iops : &simple_symlink_inode_operations;
0157 inode->i_link = data;
0158 } else {
0159 inode->i_fop = fops;
0160 }
0161 d_instantiate(dentry, inode);
0162 dget(dentry);
0163 inode_unlock(dir);
0164 return dentry;
0165
0166 out1:
0167 dput(dentry);
0168 dentry = ERR_PTR(error);
0169 out:
0170 inode_unlock(dir);
0171 simple_release_fs(&mount, &mount_count);
0172 return dentry;
0173 }
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200 struct dentry *securityfs_create_file(const char *name, umode_t mode,
0201 struct dentry *parent, void *data,
0202 const struct file_operations *fops)
0203 {
0204 return securityfs_create_dentry(name, mode, parent, data, fops, NULL);
0205 }
0206 EXPORT_SYMBOL_GPL(securityfs_create_file);
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228 struct dentry *securityfs_create_dir(const char *name, struct dentry *parent)
0229 {
0230 return securityfs_create_file(name, S_IFDIR | 0755, parent, NULL, NULL);
0231 }
0232 EXPORT_SYMBOL_GPL(securityfs_create_dir);
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260 struct dentry *securityfs_create_symlink(const char *name,
0261 struct dentry *parent,
0262 const char *target,
0263 const struct inode_operations *iops)
0264 {
0265 struct dentry *dent;
0266 char *link = NULL;
0267
0268 if (target) {
0269 link = kstrdup(target, GFP_KERNEL);
0270 if (!link)
0271 return ERR_PTR(-ENOMEM);
0272 }
0273 dent = securityfs_create_dentry(name, S_IFLNK | 0444, parent,
0274 link, NULL, iops);
0275 if (IS_ERR(dent))
0276 kfree(link);
0277
0278 return dent;
0279 }
0280 EXPORT_SYMBOL_GPL(securityfs_create_symlink);
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295 void securityfs_remove(struct dentry *dentry)
0296 {
0297 struct inode *dir;
0298
0299 if (!dentry || IS_ERR(dentry))
0300 return;
0301
0302 dir = d_inode(dentry->d_parent);
0303 inode_lock(dir);
0304 if (simple_positive(dentry)) {
0305 if (d_is_dir(dentry))
0306 simple_rmdir(dir, dentry);
0307 else
0308 simple_unlink(dir, dentry);
0309 dput(dentry);
0310 }
0311 inode_unlock(dir);
0312 simple_release_fs(&mount, &mount_count);
0313 }
0314 EXPORT_SYMBOL_GPL(securityfs_remove);
0315
0316 #ifdef CONFIG_SECURITY
0317 static struct dentry *lsm_dentry;
0318 static ssize_t lsm_read(struct file *filp, char __user *buf, size_t count,
0319 loff_t *ppos)
0320 {
0321 return simple_read_from_buffer(buf, count, ppos, lsm_names,
0322 strlen(lsm_names));
0323 }
0324
0325 static const struct file_operations lsm_ops = {
0326 .read = lsm_read,
0327 .llseek = generic_file_llseek,
0328 };
0329 #endif
0330
0331 static int __init securityfs_init(void)
0332 {
0333 int retval;
0334
0335 retval = sysfs_create_mount_point(kernel_kobj, "security");
0336 if (retval)
0337 return retval;
0338
0339 retval = register_filesystem(&fs_type);
0340 if (retval) {
0341 sysfs_remove_mount_point(kernel_kobj, "security");
0342 return retval;
0343 }
0344 #ifdef CONFIG_SECURITY
0345 lsm_dentry = securityfs_create_file("lsm", 0444, NULL, NULL,
0346 &lsm_ops);
0347 #endif
0348 return 0;
0349 }
0350 core_initcall(securityfs_init);