From: Tony Jones Subject: Pass struct vfsmount to the inode_removexattr LSM hook This is needed for computing pathnames in the AppArmor LSM. Signed-off-by: Tony Jones Signed-off-by: Andreas Gruenbacher Signed-off-by: John Johansen --- fs/xattr.c | 2 +- include/linux/security.h | 14 +++++++++----- security/commoncap.c | 3 ++- security/security.c | 5 +++-- security/selinux/hooks.c | 3 ++- security/smack/smack_lsm.c | 6 ++++-- 6 files changed, 21 insertions(+), 12 deletions(-) --- a/fs/xattr.c +++ b/fs/xattr.c @@ -202,7 +202,7 @@ vfs_removexattr(struct dentry *dentry, s if (error) return error; - error = security_inode_removexattr(dentry, name); + error = security_inode_removexattr(dentry, mnt, name); if (error) return error; --- a/include/linux/security.h +++ b/include/linux/security.h @@ -57,7 +57,8 @@ extern int cap_bprm_secureexec(struct li extern int cap_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name, const void *value, size_t size, int flags); -extern int cap_inode_removexattr(struct dentry *dentry, const char *name); +extern int cap_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt, + const char *name); extern int cap_inode_need_killpriv(struct dentry *dentry); extern int cap_inode_killpriv(struct dentry *dentry); extern int cap_task_post_setuid(uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags); @@ -1403,7 +1404,8 @@ struct security_operations { int (*inode_getxattr) (struct dentry *dentry, struct vfsmount *mnt, const char *name); int (*inode_listxattr) (struct dentry *dentry, struct vfsmount *mnt); - int (*inode_removexattr) (struct dentry *dentry, const char *name); + int (*inode_removexattr) (struct dentry *dentry, struct vfsmount *mnt, + const char *name); int (*inode_need_killpriv) (struct dentry *dentry); int (*inode_killpriv) (struct dentry *dentry); int (*inode_getsecurity) (const struct inode *inode, const char *name, void **buffer, bool alloc); @@ -1680,7 +1682,8 @@ void security_inode_post_setxattr(struct int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name); int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt); -int security_inode_removexattr(struct dentry *dentry, const char *name); +int security_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt, + const char *name); int security_inode_need_killpriv(struct dentry *dentry); int security_inode_killpriv(struct dentry *dentry); int security_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc); @@ -2128,9 +2131,10 @@ static inline int security_inode_listxat } static inline int security_inode_removexattr(struct dentry *dentry, - const char *name) + struct vfsmount *mnt, + const char *name) { - return cap_inode_removexattr(dentry, name); + return cap_inode_removexattr(dentry, mnt, name); } static inline int security_inode_need_killpriv(struct dentry *dentry) --- a/security/commoncap.c +++ b/security/commoncap.c @@ -426,7 +426,8 @@ int cap_inode_setxattr(struct dentry *de return 0; } -int cap_inode_removexattr(struct dentry *dentry, const char *name) +int cap_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt, + const char *name) { if (!strcmp(name, XATTR_NAME_CAPS)) { if (!capable(CAP_SETFCAP)) --- a/security/security.c +++ b/security/security.c @@ -506,11 +506,12 @@ int security_inode_listxattr(struct dent return security_ops->inode_listxattr(dentry, mnt); } -int security_inode_removexattr(struct dentry *dentry, const char *name) +int security_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt, + const char *name) { if (unlikely(IS_PRIVATE(dentry->d_inode))) return 0; - return security_ops->inode_removexattr(dentry, name); + return security_ops->inode_removexattr(dentry, mnt, name); } int security_inode_need_killpriv(struct dentry *dentry) --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -2807,7 +2807,8 @@ static int selinux_inode_listxattr(struc return dentry_has_perm(current, NULL, dentry, FILE__GETATTR); } -static int selinux_inode_removexattr(struct dentry *dentry, const char *name) +static int selinux_inode_removexattr(struct dentry *dentry, + struct vfsmount *mnt, const char *name) { if (strcmp(name, XATTR_NAME_SELINUX)) return selinux_inode_setotherxattr(dentry, name); --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -685,13 +685,15 @@ static int smack_inode_getxattr(struct d /* * smack_inode_removexattr - Smack check on removexattr * @dentry: the object + * @mnt: unused * @name: name of the attribute * * Removing the Smack attribute requires CAP_MAC_ADMIN * * Returns 0 if access is permitted, an error code otherwise */ -static int smack_inode_removexattr(struct dentry *dentry, const char *name) +static int smack_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt, + const char *name) { int rc = 0; @@ -701,7 +703,7 @@ static int smack_inode_removexattr(struc if (!capable(CAP_MAC_ADMIN)) rc = -EPERM; } else - rc = cap_inode_removexattr(dentry, name); + rc = cap_inode_removexattr(dentry, mnt, name); if (rc == 0) rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);