selinux: Refactor selinuxfs directory populating functions
authorDaniel Burgener <dburgener@linux.microsoft.com>
Wed, 19 Aug 2020 19:59:33 +0000 (15:59 -0400)
committerPaul Moore <paul@paul-moore.com>
Fri, 21 Aug 2020 13:37:12 +0000 (09:37 -0400)
Make sel_make_bools and sel_make_classes take the specific elements of
selinux_fs_info that they need rather than the entire struct.

This will allow a future patch to pass temporary elements that are not in
the selinux_fs_info struct to these functions so that the original elements
can be preserved until we are ready to perform the switch over.

Signed-off-by: Daniel Burgener <dburgener@linux.microsoft.com>
Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
Signed-off-by: Paul Moore <paul@paul-moore.com>
security/selinux/selinuxfs.c

index 19670e9..cac585c 100644 (file)
@@ -346,10 +346,12 @@ static const struct file_operations sel_policyvers_ops = {
 };
 
 /* declaration for sel_write_load */
-static int sel_make_bools(struct selinux_fs_info *fsi,
-                       struct selinux_policy *newpolicy);
-static int sel_make_classes(struct selinux_fs_info *fsi,
-                       struct selinux_policy *newpolicy);
+static int sel_make_bools(struct selinux_policy *newpolicy, struct dentry *bool_dir,
+                         unsigned int *bool_num, char ***bool_pending_names,
+                         unsigned int **bool_pending_values);
+static int sel_make_classes(struct selinux_policy *newpolicy,
+                           struct dentry *class_dir,
+                           unsigned long *last_class_ino);
 
 /* declaration for sel_make_class_dirs */
 static struct dentry *sel_make_dir(struct dentry *dir, const char *name,
@@ -539,13 +541,15 @@ static int sel_make_policy_nodes(struct selinux_fs_info *fsi,
 
        sel_remove_old_policy_nodes(fsi);
 
-       ret = sel_make_bools(fsi, newpolicy);
+       ret = sel_make_bools(newpolicy, fsi->bool_dir, &fsi->bool_num,
+                            &fsi->bool_pending_names, &fsi->bool_pending_values);
        if (ret) {
                pr_err("SELinux: failed to load policy booleans\n");
                return ret;
        }
 
-       ret = sel_make_classes(fsi, newpolicy);
+       ret = sel_make_classes(newpolicy, fsi->class_dir,
+                              &fsi->last_class_ino);
        if (ret) {
                pr_err("SELinux: failed to load policy classes\n");
                return ret;
@@ -1359,13 +1363,13 @@ static void sel_remove_entries(struct dentry *de)
 
 #define BOOL_DIR_NAME "booleans"
 
-static int sel_make_bools(struct selinux_fs_info *fsi,
-                       struct selinux_policy *newpolicy)
+static int sel_make_bools(struct selinux_policy *newpolicy, struct dentry *bool_dir,
+                         unsigned int *bool_num, char ***bool_pending_names,
+                         unsigned int **bool_pending_values)
 {
        int ret;
        ssize_t len;
        struct dentry *dentry = NULL;
-       struct dentry *dir = fsi->bool_dir;
        struct inode *inode = NULL;
        struct inode_security_struct *isec;
        char **names = NULL, *page;
@@ -1384,12 +1388,12 @@ static int sel_make_bools(struct selinux_fs_info *fsi,
 
        for (i = 0; i < num; i++) {
                ret = -ENOMEM;
-               dentry = d_alloc_name(dir, names[i]);
+               dentry = d_alloc_name(bool_dir, names[i]);
                if (!dentry)
                        goto out;
 
                ret = -ENOMEM;
-               inode = sel_make_inode(dir->d_sb, S_IFREG | S_IRUGO | S_IWUSR);
+               inode = sel_make_inode(bool_dir->d_sb, S_IFREG | S_IRUGO | S_IWUSR);
                if (!inode) {
                        dput(dentry);
                        goto out;
@@ -1418,9 +1422,9 @@ static int sel_make_bools(struct selinux_fs_info *fsi,
                inode->i_ino = i|SEL_BOOL_INO_OFFSET;
                d_add(dentry, inode);
        }
-       fsi->bool_num = num;
-       fsi->bool_pending_names = names;
-       fsi->bool_pending_values = values;
+       *bool_num = num;
+       *bool_pending_names = names;
+       *bool_pending_values = values;
 
        free_page((unsigned long)page);
        return 0;
@@ -1433,7 +1437,7 @@ out:
                kfree(names);
        }
        kfree(values);
-       sel_remove_entries(dir);
+       sel_remove_entries(bool_dir);
 
        return ret;
 }
@@ -1880,8 +1884,9 @@ static int sel_make_class_dir_entries(struct selinux_policy *newpolicy,
        return rc;
 }
 
-static int sel_make_classes(struct selinux_fs_info *fsi,
-                       struct selinux_policy *newpolicy)
+static int sel_make_classes(struct selinux_policy *newpolicy,
+                           struct dentry *class_dir,
+                           unsigned long *last_class_ino)
 {
 
        int rc, nclasses, i;
@@ -1892,13 +1897,13 @@ static int sel_make_classes(struct selinux_fs_info *fsi,
                return rc;
 
        /* +2 since classes are 1-indexed */
-       fsi->last_class_ino = sel_class_to_ino(nclasses + 2);
+       *last_class_ino = sel_class_to_ino(nclasses + 2);
 
        for (i = 0; i < nclasses; i++) {
                struct dentry *class_name_dir;
 
-               class_name_dir = sel_make_dir(fsi->class_dir, classes[i],
-                                             &fsi->last_class_ino);
+               class_name_dir = sel_make_dir(class_dir, classes[i],
+                                             last_class_ino);
                if (IS_ERR(class_name_dir)) {
                        rc = PTR_ERR(class_name_dir);
                        goto out;