cregit-Linux how code gets into the kernel

Release 4.11 security/inode.c

Directory: security
/*
 *  inode.c - securityfs
 *
 *  Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
 *
 *      This program is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU General Public License version
 *      2 as published by the Free Software Foundation.
 *
 *  Based on fs/debugfs/inode.c which had the following copyright notice:
 *    Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
 *    Copyright (C) 2004 IBM Inc.
 */

/* #define DEBUG */
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/pagemap.h>
#include <linux/init.h>
#include <linux/namei.h>
#include <linux/security.h>
#include <linux/lsm_hooks.h>
#include <linux/magic.h>


static struct vfsmount *mount;

static int mount_count;


static int fill_super(struct super_block *sb, void *data, int silent) { static struct tree_descr files[] = {{""}}; return simple_fill_super(sb, SECURITYFS_MAGIC, files); }

Contributors

PersonTokensPropCommitsCommitProp
Greg Kroah-Hartman40100.00%1100.00%
Total40100.00%1100.00%


static struct dentry *get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { return mount_single(fs_type, flags, data, fill_super); }

Contributors

PersonTokensPropCommitsCommitProp
Greg Kroah-Hartman3389.19%150.00%
Al Viro410.81%150.00%
Total37100.00%2100.00%

static struct file_system_type fs_type = { .owner = THIS_MODULE, .name = "securityfs", .mount = get_sb, .kill_sb = kill_litter_super, }; /** * securityfs_create_file - create a file in the securityfs filesystem * * @name: a pointer to a string containing the name of the file to create. * @mode: the permission that the file should have * @parent: a pointer to the parent dentry for this file. This should be a * directory dentry if set. If this parameter is %NULL, then the * file will be created in the root of the securityfs filesystem. * @data: a pointer to something that the caller will want to get to later * on. The inode.i_private pointer will point to this value on * the open() call. * @fops: a pointer to a struct file_operations that should be used for * this file. * * This is the basic "create a file" function for securityfs. It allows for a * wide range of flexibility in creating a file, or a directory (if you * want to create a directory, the securityfs_create_dir() function is * recommended to be used instead). * * This function returns a pointer to a dentry if it succeeds. This * pointer must be passed to the securityfs_remove() function when the file is * to be removed (no automatic cleanup happens if your module is unloaded, * you are responsible here). If an error occurs, the function will return * the error value (via ERR_PTR). * * If securityfs is not enabled in the kernel, the value %-ENODEV is * returned. */
struct dentry *securityfs_create_file(const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops) { struct dentry *dentry; int is_dir = S_ISDIR(mode); struct inode *dir, *inode; int error; if (!is_dir) { BUG_ON(!fops); mode = (mode & S_IALLUGO) | S_IFREG; } pr_debug("securityfs: creating file '%s'\n",name); error = simple_pin_fs(&fs_type, &mount, &mount_count); if (error) return ERR_PTR(error); if (!parent) parent = mount->mnt_root; dir = d_inode(parent); inode_lock(dir); dentry = lookup_one_len(name, parent, strlen(name)); if (IS_ERR(dentry)) goto out; if (d_really_is_positive(dentry)) { error = -EEXIST; goto out1; } inode = new_inode(dir->i_sb); if (!inode) { error = -ENOMEM; goto out1; } inode->i_ino = get_next_ino(); inode->i_mode = mode; inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); inode->i_private = data; if (is_dir) { inode->i_op = &simple_dir_inode_operations; inode->i_fop = &simple_dir_operations; inc_nlink(inode); inc_nlink(dir); } else { inode->i_fop = fops; } d_instantiate(dentry, inode); dget(dentry); inode_unlock(dir); return dentry; out1: dput(dentry); dentry = ERR_PTR(error); out: inode_unlock(dir); simple_release_fs(&mount, &mount_count); return dentry; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro21064.81%337.50%
Greg Kroah-Hartman10131.17%112.50%
David Howells61.85%112.50%
Deepa Dinamani41.23%112.50%
Trond Myklebust20.62%112.50%
Arjan van de Ven10.31%112.50%
Total324100.00%8100.00%

EXPORT_SYMBOL_GPL(securityfs_create_file); /** * securityfs_create_dir - create a directory in the securityfs filesystem * * @name: a pointer to a string containing the name of the directory to * create. * @parent: a pointer to the parent dentry for this file. This should be a * directory dentry if set. If this parameter is %NULL, then the * directory will be created in the root of the securityfs filesystem. * * This function creates a directory in securityfs with the given @name. * * This function returns a pointer to a dentry if it succeeds. This * pointer must be passed to the securityfs_remove() function when the file is * to be removed (no automatic cleanup happens if your module is unloaded, * you are responsible here). If an error occurs, the function will return * the error value (via ERR_PTR). * * If securityfs is not enabled in the kernel, the value %-ENODEV is * returned. */
struct dentry *securityfs_create_dir(const char *name, struct dentry *parent) { return securityfs_create_file(name, S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, parent, NULL, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Greg Kroah-Hartman37100.00%1100.00%
Total37100.00%1100.00%

EXPORT_SYMBOL_GPL(securityfs_create_dir); /** * securityfs_remove - removes a file or directory from the securityfs filesystem * * @dentry: a pointer to a the dentry of the file or directory to be removed. * * This function removes a file or directory in securityfs that was previously * created with a call to another securityfs function (like * securityfs_create_file() or variants thereof.) * * This function is required to be called in order for the file to be * removed. No automatic cleanup of files will happen when a module is * removed; you are responsible here. */
void securityfs_remove(struct dentry *dentry) { struct inode *dir; if (!dentry || IS_ERR(dentry)) return; dir = d_inode(dentry->d_parent); inode_lock(dir); if (simple_positive(dentry)) { if (d_is_dir(dentry)) simple_rmdir(dir, dentry); else simple_unlink(dir, dentry); dput(dentry); } inode_unlock(dir); simple_release_fs(&mount, &mount_count); }

Contributors

PersonTokensPropCommitsCommitProp
Greg Kroah-Hartman6471.11%114.29%
Al Viro1617.78%342.86%
Eric Paris55.56%114.29%
David Howells55.56%228.57%
Total90100.00%7100.00%

EXPORT_SYMBOL_GPL(securityfs_remove); #ifdef CONFIG_SECURITY static struct dentry *lsm_dentry;
static ssize_t lsm_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) { return simple_read_from_buffer(buf, count, ppos, lsm_names, strlen(lsm_names)); }

Contributors

PersonTokensPropCommitsCommitProp
Casey Schaufler40100.00%1100.00%
Total40100.00%1100.00%

static const struct file_operations lsm_ops = { .read = lsm_read, .llseek = generic_file_llseek, }; #endif
static int __init securityfs_init(void) { int retval; retval = sysfs_create_mount_point(kernel_kobj, "security"); if (retval) return retval; retval = register_filesystem(&fs_type); if (retval) { sysfs_remove_mount_point(kernel_kobj, "security"); return retval; } #ifdef CONFIG_SECURITY lsm_dentry = securityfs_create_file("lsm", 0444, NULL, NULL, &lsm_ops); #endif return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Greg Kroah-Hartman4052.63%360.00%
Casey Schaufler2634.21%120.00%
Eric W. Biedermann1013.16%120.00%
Total76100.00%5100.00%

core_initcall(securityfs_init); MODULE_LICENSE("GPL");

Overall Contributors

PersonTokensPropCommitsCommitProp
Greg Kroah-Hartman39251.11%314.29%
Al Viro23831.03%628.57%
Casey Schaufler9812.78%14.76%
David Howells111.43%29.52%
Eric W. Biedermann101.30%14.76%
Eric Paris50.65%14.76%
Deepa Dinamani40.52%14.76%
Mimi Zohar30.39%14.76%
Trond Myklebust20.26%14.76%
Arjan van de Ven10.13%14.76%
Masanari Iida10.13%14.76%
Laurent Georget10.13%14.76%
Randy Dunlap10.13%14.76%
Total767100.00%21100.00%
Directory: security
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.