upstream commit 66ec384ad3044d63c9726493a412a2ad5317eae5
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 --- security/selinux/selinuxfs.c | 40 +++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index 092c7295f78d..ea21f3ef4a6f 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c @@ -340,8 +340,11 @@ static const struct file_operations sel_policyvers_ops = { };
/* declaration for sel_write_load */ -static int sel_make_bools(struct selinux_fs_info *fsi); -static int sel_make_classes(struct selinux_fs_info *fsi); +static int sel_make_bools(struct selinux_fs_info *fsi, struct dentry *bool_dir, + unsigned int *bool_num, char ***bool_pending_names, + unsigned int **bool_pending_values); +static int sel_make_classes(struct selinux_fs_info *fsi, struct dentry *class_dir, + unsigned long *last_class_ino); static int sel_make_policycap(struct selinux_fs_info *fsi);
/* declaration for sel_make_class_dirs */ @@ -531,13 +534,15 @@ static int sel_make_policy_nodes(struct selinux_fs_info *fsi)
sel_remove_old_policy_nodes(fsi);
- ret = sel_make_bools(fsi); + ret = sel_make_bools(fsi, 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); + ret = sel_make_classes(fsi, fsi->class_dir, + &fsi->last_class_ino); if (ret) { pr_err("SELinux: failed to load policy classes\n"); return ret; @@ -1348,12 +1353,13 @@ static void sel_remove_entries(struct dentry *de)
#define BOOL_DIR_NAME "booleans"
-static int sel_make_bools(struct selinux_fs_info *fsi) +static int sel_make_bools(struct selinux_fs_info *fsi, struct dentry *bool_dir, + unsigned int *bool_num, char ***bool_pending_names, + unsigned int **bool_pending_values) { int i, 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; @@ -1372,12 +1378,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; @@ -1406,9 +1412,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; @@ -1421,7 +1427,7 @@ static int sel_make_bools(struct selinux_fs_info *fsi) kfree(names); } kfree(values); - sel_remove_entries(dir); + sel_remove_entries(bool_dir);
return ret; } @@ -1806,7 +1812,9 @@ static int sel_make_class_dir_entries(char *classname, int index, return rc; }
-static int sel_make_classes(struct selinux_fs_info *fsi) +static int sel_make_classes(struct selinux_fs_info *fsi, + struct dentry *class_dir, + unsigned long *last_class_ino) {
int rc, nclasses, i; @@ -1817,13 +1825,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;