LSM/SELinux: Interfaces to allow FS to control mount options

Introduce new LSM interfaces to allow an FS to deal with their own mount
options.  This includes a new string parsing function exported from the
LSM that an FS can use to get a security data blob and a new security
data blob.  This is particularly useful for an FS which uses binary
mount data, like NFS, which does not pass strings into the vfs to be
handled by the loaded LSM.  Also fix a BUG() in both SELinux and SMACK
when dealing with binary mount data.  If the binary mount data is less
than one page the copy_page() in security_sb_copy_data() can cause an
illegal page fault and boom.  Remove all NFSisms from the SELinux code
since they were broken by past NFS changes.

Signed-off-by: Eric Paris <[email protected]>
Acked-by: Stephen Smalley <[email protected]>
Acked-by: Casey Schaufler <[email protected]>
Signed-off-by: James Morris <[email protected]>
This commit is contained in:
Eric Paris 2008-03-05 10:31:54 -05:00 • committed by James Morris
commit e000752989
7 changed files with 204 additions and 134 deletions

View file

@ -181,8 +181,7 @@ static void dummy_sb_free_security (struct super_block *sb)
return;
}
static int dummy_sb_copy_data (struct file_system_type *type,
void *orig, void *copy)
static int dummy_sb_copy_data (char *orig, char *copy)
{
return 0;
}
@ -245,19 +244,17 @@ static void dummy_sb_post_pivotroot (struct nameidata *old_nd, struct nameidata
return;
}
static int dummy_sb_get_mnt_opts(const struct super_block *sb, char ***mount_options,
int **flags, int *num_opts)
static int dummy_sb_get_mnt_opts(const struct super_block *sb,
struct security_mnt_opts *opts)
{
*mount_options = NULL;
*flags = NULL;
*num_opts = 0;
security_init_mnt_opts(opts);
return 0;
}
static int dummy_sb_set_mnt_opts(struct super_block *sb, char **mount_options,
int *flags, int num_opts)
static int dummy_sb_set_mnt_opts(struct super_block *sb,
struct security_mnt_opts *opts)
{
if (unlikely(num_opts))
if (unlikely(opts->num_mnt_opts))
return -EOPNOTSUPP;
return 0;
}
@ -268,6 +265,11 @@ static void dummy_sb_clone_mnt_opts(const struct super_block *oldsb,
return;
}
static int dummy_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
{
return 0;
}
static int dummy_inode_alloc_security (struct inode *inode)
{
return 0;
@ -1028,6 +1030,7 @@ void security_fixup_ops (struct security_operations *ops)
set_to_dummy_if_null(ops, sb_get_mnt_opts);
set_to_dummy_if_null(ops, sb_set_mnt_opts);
set_to_dummy_if_null(ops, sb_clone_mnt_opts);
set_to_dummy_if_null(ops, sb_parse_opts_str);
set_to_dummy_if_null(ops, inode_alloc_security);
set_to_dummy_if_null(ops, inode_free_security);
set_to_dummy_if_null(ops, inode_init_security);