Merge branch 'mount.part1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs mount API prep from Al Viro: "Mount API prereqs. Mostly that's LSM mount options cleanups. There are several minor fixes in there, but nothing earth-shattering (leaks on failure exits, mostly)" * 'mount.part1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (27 commits) mount_fs: suppress MAC on MS_SUBMOUNT as well as MS_KERNMOUNT smack: rewrite smack_sb_eat_lsm_opts() smack: get rid of match_token() smack: take the guts of smack_parse_opts_str() into a new helper LSM: new method: ->sb_add_mnt_opt() selinux: rewrite selinux_sb_eat_lsm_opts() selinux: regularize Opt_... names a bit selinux: switch away from match_token() selinux: new helper - selinux_add_opt() LSM: bury struct security_mnt_opts smack: switch to private smack_mnt_opts selinux: switch to private struct selinux_mnt_opts LSM: hide struct security_mnt_opts from any generic code selinux: kill selinux_sb_get_mnt_opts() LSM: turn sb_eat_lsm_opts() into a method nfs_remount(): don't leak, don't ignore LSM options quietly btrfs: sanitize security_mnt_opts use selinux; don't open-code a loop in sb_finish_set_opts() LSM: split ->sb_set_mnt_opts() out of ->sb_kern_mount() new helper: security_sb_eat_lsm_opts() ...
This commit is contained in:
@@ -1461,9 +1461,10 @@ union security_list_options {
|
||||
|
||||
int (*sb_alloc_security)(struct super_block *sb);
|
||||
void (*sb_free_security)(struct super_block *sb);
|
||||
int (*sb_copy_data)(char *orig, char *copy);
|
||||
int (*sb_remount)(struct super_block *sb, void *data);
|
||||
int (*sb_kern_mount)(struct super_block *sb, int flags, void *data);
|
||||
void (*sb_free_mnt_opts)(void *mnt_opts);
|
||||
int (*sb_eat_lsm_opts)(char *orig, void **mnt_opts);
|
||||
int (*sb_remount)(struct super_block *sb, void *mnt_opts);
|
||||
int (*sb_kern_mount)(struct super_block *sb);
|
||||
int (*sb_show_options)(struct seq_file *m, struct super_block *sb);
|
||||
int (*sb_statfs)(struct dentry *dentry);
|
||||
int (*sb_mount)(const char *dev_name, const struct path *path,
|
||||
@@ -1471,14 +1472,15 @@ union security_list_options {
|
||||
int (*sb_umount)(struct vfsmount *mnt, int flags);
|
||||
int (*sb_pivotroot)(const struct path *old_path, const struct path *new_path);
|
||||
int (*sb_set_mnt_opts)(struct super_block *sb,
|
||||
struct security_mnt_opts *opts,
|
||||
void *mnt_opts,
|
||||
unsigned long kern_flags,
|
||||
unsigned long *set_kern_flags);
|
||||
int (*sb_clone_mnt_opts)(const struct super_block *oldsb,
|
||||
struct super_block *newsb,
|
||||
unsigned long kern_flags,
|
||||
unsigned long *set_kern_flags);
|
||||
int (*sb_parse_opts_str)(char *options, struct security_mnt_opts *opts);
|
||||
int (*sb_add_mnt_opt)(const char *option, const char *val, int len,
|
||||
void **mnt_opts);
|
||||
int (*dentry_init_security)(struct dentry *dentry, int mode,
|
||||
const struct qstr *name, void **ctx,
|
||||
u32 *ctxlen);
|
||||
@@ -1800,7 +1802,8 @@ struct security_hook_heads {
|
||||
struct hlist_head bprm_committed_creds;
|
||||
struct hlist_head sb_alloc_security;
|
||||
struct hlist_head sb_free_security;
|
||||
struct hlist_head sb_copy_data;
|
||||
struct hlist_head sb_free_mnt_opts;
|
||||
struct hlist_head sb_eat_lsm_opts;
|
||||
struct hlist_head sb_remount;
|
||||
struct hlist_head sb_kern_mount;
|
||||
struct hlist_head sb_show_options;
|
||||
@@ -1810,7 +1813,7 @@ struct security_hook_heads {
|
||||
struct hlist_head sb_pivotroot;
|
||||
struct hlist_head sb_set_mnt_opts;
|
||||
struct hlist_head sb_clone_mnt_opts;
|
||||
struct hlist_head sb_parse_opts_str;
|
||||
struct hlist_head sb_add_mnt_opt;
|
||||
struct hlist_head dentry_init_security;
|
||||
struct hlist_head dentry_create_files_as;
|
||||
#ifdef CONFIG_SECURITY_PATH
|
||||
|
||||
@@ -81,7 +81,7 @@ extern void mnt_drop_write_file(struct file *file);
|
||||
extern void mntput(struct vfsmount *mnt);
|
||||
extern struct vfsmount *mntget(struct vfsmount *mnt);
|
||||
extern struct vfsmount *mnt_clone_internal(const struct path *path);
|
||||
extern int __mnt_is_readonly(struct vfsmount *mnt);
|
||||
extern bool __mnt_is_readonly(struct vfsmount *mnt);
|
||||
extern bool mnt_may_suid(struct vfsmount *mnt);
|
||||
|
||||
struct path;
|
||||
|
||||
@@ -182,36 +182,10 @@ static inline const char *kernel_load_data_id_str(enum kernel_load_data_id id)
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
|
||||
struct security_mnt_opts {
|
||||
char **mnt_opts;
|
||||
int *mnt_opts_flags;
|
||||
int num_mnt_opts;
|
||||
};
|
||||
|
||||
int call_lsm_notifier(enum lsm_event event, void *data);
|
||||
int register_lsm_notifier(struct notifier_block *nb);
|
||||
int unregister_lsm_notifier(struct notifier_block *nb);
|
||||
|
||||
static inline void security_init_mnt_opts(struct security_mnt_opts *opts)
|
||||
{
|
||||
opts->mnt_opts = NULL;
|
||||
opts->mnt_opts_flags = NULL;
|
||||
opts->num_mnt_opts = 0;
|
||||
}
|
||||
|
||||
static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
|
||||
{
|
||||
int i;
|
||||
if (opts->mnt_opts)
|
||||
for (i = 0; i < opts->num_mnt_opts; i++)
|
||||
kfree(opts->mnt_opts[i]);
|
||||
kfree(opts->mnt_opts);
|
||||
opts->mnt_opts = NULL;
|
||||
kfree(opts->mnt_opts_flags);
|
||||
opts->mnt_opts_flags = NULL;
|
||||
opts->num_mnt_opts = 0;
|
||||
}
|
||||
|
||||
/* prototypes */
|
||||
extern int security_init(void);
|
||||
|
||||
@@ -248,9 +222,10 @@ void security_bprm_committing_creds(struct linux_binprm *bprm);
|
||||
void security_bprm_committed_creds(struct linux_binprm *bprm);
|
||||
int security_sb_alloc(struct super_block *sb);
|
||||
void security_sb_free(struct super_block *sb);
|
||||
int security_sb_copy_data(char *orig, char *copy);
|
||||
int security_sb_remount(struct super_block *sb, void *data);
|
||||
int security_sb_kern_mount(struct super_block *sb, int flags, void *data);
|
||||
void security_free_mnt_opts(void **mnt_opts);
|
||||
int security_sb_eat_lsm_opts(char *options, void **mnt_opts);
|
||||
int security_sb_remount(struct super_block *sb, void *mnt_opts);
|
||||
int security_sb_kern_mount(struct super_block *sb);
|
||||
int security_sb_show_options(struct seq_file *m, struct super_block *sb);
|
||||
int security_sb_statfs(struct dentry *dentry);
|
||||
int security_sb_mount(const char *dev_name, const struct path *path,
|
||||
@@ -258,14 +233,15 @@ int security_sb_mount(const char *dev_name, const struct path *path,
|
||||
int security_sb_umount(struct vfsmount *mnt, int flags);
|
||||
int security_sb_pivotroot(const struct path *old_path, const struct path *new_path);
|
||||
int security_sb_set_mnt_opts(struct super_block *sb,
|
||||
struct security_mnt_opts *opts,
|
||||
void *mnt_opts,
|
||||
unsigned long kern_flags,
|
||||
unsigned long *set_kern_flags);
|
||||
int security_sb_clone_mnt_opts(const struct super_block *oldsb,
|
||||
struct super_block *newsb,
|
||||
unsigned long kern_flags,
|
||||
unsigned long *set_kern_flags);
|
||||
int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts);
|
||||
int security_add_mnt_opt(const char *option, const char *val,
|
||||
int len, void **mnt_opts);
|
||||
int security_dentry_init_security(struct dentry *dentry, int mode,
|
||||
const struct qstr *name, void **ctx,
|
||||
u32 *ctxlen);
|
||||
@@ -403,8 +379,6 @@ int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen);
|
||||
int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);
|
||||
int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen);
|
||||
#else /* CONFIG_SECURITY */
|
||||
struct security_mnt_opts {
|
||||
};
|
||||
|
||||
static inline int call_lsm_notifier(enum lsm_event event, void *data)
|
||||
{
|
||||
@@ -421,11 +395,7 @@ static inline int unregister_lsm_notifier(struct notifier_block *nb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void security_init_mnt_opts(struct security_mnt_opts *opts)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
|
||||
static inline void security_free_mnt_opts(void **mnt_opts)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -555,17 +525,19 @@ static inline int security_sb_alloc(struct super_block *sb)
|
||||
static inline void security_sb_free(struct super_block *sb)
|
||||
{ }
|
||||
|
||||
static inline int security_sb_copy_data(char *orig, char *copy)
|
||||
static inline int security_sb_eat_lsm_opts(char *options,
|
||||
void **mnt_opts)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_sb_remount(struct super_block *sb, void *data)
|
||||
static inline int security_sb_remount(struct super_block *sb,
|
||||
void *mnt_opts)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_sb_kern_mount(struct super_block *sb, int flags, void *data)
|
||||
static inline int security_sb_kern_mount(struct super_block *sb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -600,7 +572,7 @@ static inline int security_sb_pivotroot(const struct path *old_path,
|
||||
}
|
||||
|
||||
static inline int security_sb_set_mnt_opts(struct super_block *sb,
|
||||
struct security_mnt_opts *opts,
|
||||
void *mnt_opts,
|
||||
unsigned long kern_flags,
|
||||
unsigned long *set_kern_flags)
|
||||
{
|
||||
@@ -615,7 +587,8 @@ static inline int security_sb_clone_mnt_opts(const struct super_block *oldsb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
|
||||
static inline int security_add_mnt_opt(const char *option, const char *val,
|
||||
int len, void **mnt_opts)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -1820,28 +1793,5 @@ static inline void security_bpf_prog_free(struct bpf_prog_aux *aux)
|
||||
#endif /* CONFIG_SECURITY */
|
||||
#endif /* CONFIG_BPF_SYSCALL */
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
|
||||
static inline char *alloc_secdata(void)
|
||||
{
|
||||
return (char *)get_zeroed_page(GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline void free_secdata(void *secdata)
|
||||
{
|
||||
free_page((unsigned long)secdata);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline char *alloc_secdata(void)
|
||||
{
|
||||
return (char *)1;
|
||||
}
|
||||
|
||||
static inline void free_secdata(void *secdata)
|
||||
{ }
|
||||
#endif /* CONFIG_SECURITY */
|
||||
|
||||
#endif /* ! __LINUX_SECURITY_H */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user