OSDN Git Service

selinux: expand superblock_doinit() calls
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 11 Nov 2018 04:46:07 +0000 (23:46 -0500)
committerDavid Howells <dhowells@redhat.com>
Thu, 20 Dec 2018 16:32:56 +0000 (16:32 +0000)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Reviewed-by: David Howells <dhowells@redhat.com>
security/selinux/hooks.c

index f695438..4bd6f94 100644 (file)
@@ -1202,33 +1202,6 @@ out_err:
        kfree(rootcontext);
        return rc;
 }
-/*
- * string mount options parsing and call set the sbsec
- */
-static int superblock_doinit(struct super_block *sb, void *data)
-{
-       int rc = 0;
-       char *options = data;
-       struct security_mnt_opts opts;
-
-       security_init_mnt_opts(&opts);
-
-       if (!data)
-               goto out;
-
-       BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
-
-       rc = selinux_parse_opts_str(options, &opts);
-       if (rc)
-               goto out_err;
-
-out:
-       rc = selinux_set_mnt_opts(sb, &opts, 0, NULL);
-
-out_err:
-       security_free_mnt_opts(&opts);
-       return rc;
-}
 
 static void selinux_write_opts(struct seq_file *m,
                               struct security_mnt_opts *opts)
@@ -2926,11 +2899,28 @@ out_bad_option:
 
 static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
 {
+       char *options = data;
        const struct cred *cred = current_cred();
        struct common_audit_data ad;
-       int rc;
+       int rc = 0;
+       struct security_mnt_opts opts;
+
+       security_init_mnt_opts(&opts);
+
+       if (!data)
+               goto out;
+
+       BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
+
+       rc = selinux_parse_opts_str(options, &opts);
+       if (rc)
+               goto out_err;
+
+out:
+       rc = selinux_set_mnt_opts(sb, &opts, 0, NULL);
 
-       rc = superblock_doinit(sb, data);
+out_err:
+       security_free_mnt_opts(&opts);
        if (rc)
                return rc;
 
@@ -7194,7 +7184,11 @@ static __init int selinux_init(void)
 
 static void delayed_superblock_init(struct super_block *sb, void *unused)
 {
-       superblock_doinit(sb, NULL);
+       struct security_mnt_opts opts;
+
+       security_init_mnt_opts(&opts);
+       selinux_set_mnt_opts(sb, &opts, 0, NULL);
+       security_free_mnt_opts(&opts);
 }
 
 void selinux_complete_init(void)