]> err.no Git - linux-2.6/blobdiff - security/selinux/selinuxfs.c
[PATCH] sata_nv: convert to new EH
[linux-2.6] / security / selinux / selinuxfs.c
index cc782083d71fd2b793b7063df6b95f8400a3b92b..a4efc966f065eae8599ee034a3ac760efca0d92f 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/major.h>
 #include <linux/seq_file.h>
 #include <linux/percpu.h>
+#include <linux/audit.h>
 #include <asm/uaccess.h>
 #include <asm/semaphore.h>
 
@@ -127,6 +128,10 @@ static ssize_t sel_write_enforce(struct file * file, const char __user * buf,
                length = task_has_security(current, SECURITY__SETENFORCE);
                if (length)
                        goto out;
+               audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS,
+                       "enforcing=%d old_enforcing=%d auid=%u", new_value, 
+                       selinux_enforcing,
+                       audit_get_loginuid(current->audit_context));
                selinux_enforcing = new_value;
                if (selinux_enforcing)
                        avc_ss_reset(0);
@@ -177,6 +182,9 @@ static ssize_t sel_write_disable(struct file * file, const char __user * buf,
                length = selinux_disable();
                if (length < 0)
                        goto out;
+               audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS,
+                       "selinux=0 auid=%u",
+                       audit_get_loginuid(current->audit_context));
        }
 
        length = count;
@@ -262,6 +270,9 @@ static ssize_t sel_write_load(struct file * file, const char __user * buf,
                length = ret;
        else
                length = count;
+       audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_POLICY_LOAD,
+               "policy loaded auid=%u",
+               audit_get_loginuid(current->audit_context));
 out:
        mutex_unlock(&sel_mutex);
        vfree(data);
@@ -970,7 +981,7 @@ out:
        return ret;
 err:
        kfree(values);
-       d_genocide(dir);
+       sel_remove_bools(dir);
        ret = -ENOMEM;
        goto out;
 }
@@ -1151,37 +1162,38 @@ static int sel_make_avc_files(struct dentry *dir)
                dentry = d_alloc_name(dir, files[i].name);
                if (!dentry) {
                        ret = -ENOMEM;
-                       goto err;
+                       goto out;
                }
 
                inode = sel_make_inode(dir->d_sb, S_IFREG|files[i].mode);
                if (!inode) {
                        ret = -ENOMEM;
-                       goto err;
+                       goto out;
                }
                inode->i_fop = files[i].ops;
                d_add(dentry, inode);
        }
 out:
        return ret;
-err:
-       d_genocide(dir);
-       goto out;
 }
 
-static int sel_make_dir(struct super_block *sb, struct dentry *dentry)
+static int sel_make_dir(struct inode *dir, struct dentry *dentry)
 {
        int ret = 0;
        struct inode *inode;
 
-       inode = sel_make_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO);
+       inode = sel_make_inode(dir->i_sb, S_IFDIR | S_IRUGO | S_IXUGO);
        if (!inode) {
                ret = -ENOMEM;
                goto out;
        }
        inode->i_op = &simple_dir_inode_operations;
        inode->i_fop = &simple_dir_operations;
+       /* directory inodes start off with i_nlink == 2 (for "." entry) */
+       inode->i_nlink++;
        d_add(dentry, inode);
+       /* bump link count on parent directory, too */
+       dir->i_nlink++;
 out:
        return ret;
 }
@@ -1190,7 +1202,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
 {
        int ret;
        struct dentry *dentry;
-       struct inode *inode;
+       struct inode *inode, *root_inode;
        struct inode_security_struct *isec;
 
        static struct tree_descr selinux_files[] = {
@@ -1211,30 +1223,33 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
        };
        ret = simple_fill_super(sb, SELINUX_MAGIC, selinux_files);
        if (ret)
-               return ret;
+               goto err;
+
+       root_inode = sb->s_root->d_inode;
 
        dentry = d_alloc_name(sb->s_root, BOOL_DIR_NAME);
-       if (!dentry)
-               return -ENOMEM;
+       if (!dentry) {
+               ret = -ENOMEM;
+               goto err;
+       }
 
-       inode = sel_make_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO);
-       if (!inode)
-               goto out;
-       inode->i_op = &simple_dir_inode_operations;
-       inode->i_fop = &simple_dir_operations;
-       d_add(dentry, inode);
-       bool_dir = dentry;
-       ret = sel_make_bools();
+       ret = sel_make_dir(root_inode, dentry);
        if (ret)
-               goto out;
+               goto err;
+
+       bool_dir = dentry;
 
        dentry = d_alloc_name(sb->s_root, NULL_FILE_NAME);
-       if (!dentry)
-               return -ENOMEM;
+       if (!dentry) {
+               ret = -ENOMEM;
+               goto err;
+       }
 
        inode = sel_make_inode(sb, S_IFCHR | S_IRUGO | S_IWUGO);
-       if (!inode)
-               goto out;
+       if (!inode) {
+               ret = -ENOMEM;
+               goto err;
+       }
        isec = (struct inode_security_struct*)inode->i_security;
        isec->sid = SECINITSID_DEVNULL;
        isec->sclass = SECCLASS_CHR_FILE;
@@ -1245,22 +1260,23 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
        selinux_null = dentry;
 
        dentry = d_alloc_name(sb->s_root, "avc");
-       if (!dentry)
-               return -ENOMEM;
+       if (!dentry) {
+               ret = -ENOMEM;
+               goto err;
+       }
 
-       ret = sel_make_dir(sb, dentry);
+       ret = sel_make_dir(root_inode, dentry);
        if (ret)
-               goto out;
+               goto err;
 
        ret = sel_make_avc_files(dentry);
        if (ret)
-               goto out;
-
-       return 0;
+               goto err;
 out:
-       dput(dentry);
+       return ret;
+err:
        printk(KERN_ERR "%s:  failed while creating inodes\n", __FUNCTION__);
-       return -ENOMEM;
+       goto out;
 }
 
 static struct super_block *sel_get_sb(struct file_system_type *fs_type,