1
From: Tony Jones <tonyj@suse.de>
2
Subject: Pass struct vfsmount to the inode_setattr LSM hook
4
This is needed for computing pathnames in the AppArmor LSM.
6
Signed-off-by: Tony Jones <tonyj@suse.de>
7
Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
8
Signed-off-by: John Johansen <jjohansen@suse.de>
12
include/linux/security.h | 10 +++++++---
13
security/dummy.c | 3 ++-
14
security/security.c | 5 +++--
15
security/selinux/hooks.c | 5 +++--
16
5 files changed, 17 insertions(+), 10 deletions(-)
20
@@ -159,13 +159,13 @@ int notify_change(struct dentry *dentry,
21
down_write(&dentry->d_inode->i_alloc_sem);
23
if (inode->i_op && inode->i_op->setattr) {
24
- error = security_inode_setattr(dentry, attr);
25
+ error = security_inode_setattr(dentry, mnt, attr);
27
error = inode->i_op->setattr(dentry, attr);
29
error = inode_change_ok(inode, attr);
31
- error = security_inode_setattr(dentry, attr);
32
+ error = security_inode_setattr(dentry, mnt, attr);
34
if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
35
(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid))
36
--- a/include/linux/security.h
37
+++ b/include/linux/security.h
38
@@ -416,6 +416,7 @@ static inline void security_free_mnt_opt
39
* file attributes change (such as when a file is truncated, chown/chmod
40
* operations, transferring disk quotas, etc).
41
* @dentry contains the dentry structure for the file.
42
+ * @mnt is the vfsmount corresponding to @dentry (may be NULL).
43
* @attr is the iattr structure containing the new file attributes.
44
* Return 0 if permission is granted.
46
@@ -1372,7 +1373,8 @@ struct security_operations {
47
int (*inode_readlink) (struct dentry *dentry);
48
int (*inode_follow_link) (struct dentry *dentry, struct nameidata *nd);
49
int (*inode_permission) (struct inode *inode, int mask, struct nameidata *nd);
50
- int (*inode_setattr) (struct dentry *dentry, struct iattr *attr);
51
+ int (*inode_setattr) (struct dentry *dentry, struct vfsmount *mnt,
52
+ struct iattr *attr);
53
int (*inode_getattr) (struct vfsmount *mnt, struct dentry *dentry);
54
void (*inode_delete) (struct inode *inode);
55
int (*inode_setxattr) (struct dentry *dentry, const char *name,
56
@@ -1644,7 +1646,8 @@ int security_inode_rename(struct inode *
57
int security_inode_readlink(struct dentry *dentry);
58
int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd);
59
int security_inode_permission(struct inode *inode, int mask, struct nameidata *nd);
60
-int security_inode_setattr(struct dentry *dentry, struct iattr *attr);
61
+int security_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
62
+ struct iattr *attr);
63
int security_inode_getattr(struct vfsmount *mnt, struct dentry *dentry);
64
void security_inode_delete(struct inode *inode);
65
int security_inode_setxattr(struct dentry *dentry, const char *name,
66
@@ -2042,7 +2045,8 @@ static inline int security_inode_permiss
69
static inline int security_inode_setattr(struct dentry *dentry,
71
+ struct vfsmount *mnt,
76
--- a/security/dummy.c
77
+++ b/security/dummy.c
78
@@ -352,7 +352,8 @@ static int dummy_inode_permission (struc
82
-static int dummy_inode_setattr (struct dentry *dentry, struct iattr *iattr)
83
+static int dummy_inode_setattr (struct dentry *dentry, struct vfsmount *mnt,
84
+ struct iattr *iattr)
88
--- a/security/security.c
89
+++ b/security/security.c
90
@@ -471,11 +471,12 @@ int security_inode_permission(struct ino
91
return security_ops->inode_permission(inode, mask, nd);
94
-int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
95
+int security_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
98
if (unlikely(IS_PRIVATE(dentry->d_inode)))
100
- return security_ops->inode_setattr(dentry, attr);
101
+ return security_ops->inode_setattr(dentry, mnt, attr);
104
int security_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
105
--- a/security/selinux/hooks.c
106
+++ b/security/selinux/hooks.c
107
@@ -2598,11 +2598,12 @@ static int selinux_inode_permission(stru
108
open_file_mask_to_av(inode->i_mode, mask), NULL);
111
-static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
112
+static int selinux_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
113
+ struct iattr *iattr)
117
- rc = secondary_ops->inode_setattr(dentry, iattr);
118
+ rc = secondary_ops->inode_setattr(dentry, mnt, iattr);