diff options
author | Stephen Smalley <sds@tycho.nsa.gov> | 2018-12-12 10:10:56 -0500 |
---|---|---|
committer | Paul Moore <paul@paul-moore.com> | 2019-01-10 20:34:37 -0500 |
commit | e46e01eebbbcf2ff6d28ee7cae9f117e9d1572c8 (patch) | |
tree | 21fb06603d0a98d0146053922e1a93ba5ded5817 /security/selinux | |
parent | 3a28cff3bd4bf43f02be0c4e7933aebf3dc8197e (diff) |
selinux: stop passing MAY_NOT_BLOCK to the AVC upon follow_link
commit bda0be7ad9948 ("security: make inode_follow_link RCU-walk aware")
switched selinux_inode_follow_link() to use avc_has_perm_flags() and
pass down the MAY_NOT_BLOCK flag if called during RCU walk. However,
the only test of MAY_NOT_BLOCK occurs during slow_avc_audit()
and only if passing an inode as audit data (LSM_AUDIT_DATA_INODE). Since
selinux_inode_follow_link() passes a dentry directly, passing MAY_NOT_BLOCK
here serves no purpose. Switch selinux_inode_follow_link() to use
avc_has_perm() and drop avc_has_perm_flags() since there are no other
users.
Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: Paul Moore <paul@paul-moore.com>
Diffstat (limited to 'security/selinux')
-rw-r--r-- | security/selinux/avc.c | 24 | ||||
-rw-r--r-- | security/selinux/hooks.c | 5 | ||||
-rw-r--r-- | security/selinux/include/avc.h | 5 |
3 files changed, 4 insertions, 30 deletions
diff --git a/security/selinux/avc.c b/security/selinux/avc.c index 5de18a6d5c3f..9b63d8ee1687 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c | |||
@@ -867,9 +867,8 @@ static int avc_update_node(struct selinux_avc *avc, | |||
867 | * permissive mode that only appear when in enforcing mode. | 867 | * permissive mode that only appear when in enforcing mode. |
868 | * | 868 | * |
869 | * See the corresponding handling in slow_avc_audit(), and the | 869 | * See the corresponding handling in slow_avc_audit(), and the |
870 | * logic in selinux_inode_follow_link and selinux_inode_permission | 870 | * logic in selinux_inode_permission for the MAY_NOT_BLOCK flag, |
871 | * for the VFS MAY_NOT_BLOCK flag, which is transliterated into | 871 | * which is transliterated into AVC_NONBLOCKING. |
872 | * AVC_NONBLOCKING for avc_has_perm_noaudit(). | ||
873 | */ | 872 | */ |
874 | if (flags & AVC_NONBLOCKING) | 873 | if (flags & AVC_NONBLOCKING) |
875 | return 0; | 874 | return 0; |
@@ -1209,25 +1208,6 @@ int avc_has_perm(struct selinux_state *state, u32 ssid, u32 tsid, u16 tclass, | |||
1209 | return rc; | 1208 | return rc; |
1210 | } | 1209 | } |
1211 | 1210 | ||
1212 | int avc_has_perm_flags(struct selinux_state *state, | ||
1213 | u32 ssid, u32 tsid, u16 tclass, u32 requested, | ||
1214 | struct common_audit_data *auditdata, | ||
1215 | int flags) | ||
1216 | { | ||
1217 | struct av_decision avd; | ||
1218 | int rc, rc2; | ||
1219 | |||
1220 | rc = avc_has_perm_noaudit(state, ssid, tsid, tclass, requested, | ||
1221 | (flags & MAY_NOT_BLOCK) ? AVC_NONBLOCKING : 0, | ||
1222 | &avd); | ||
1223 | |||
1224 | rc2 = avc_audit(state, ssid, tsid, tclass, requested, &avd, rc, | ||
1225 | auditdata, flags); | ||
1226 | if (rc2) | ||
1227 | return rc2; | ||
1228 | return rc; | ||
1229 | } | ||
1230 | |||
1231 | u32 avc_policy_seqno(struct selinux_state *state) | 1211 | u32 avc_policy_seqno(struct selinux_state *state) |
1232 | { | 1212 | { |
1233 | return state->avc->avc_cache.latest_notif; | 1213 | return state->avc->avc_cache.latest_notif; |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 7f6068489a02..f08a0f201967 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -2925,9 +2925,8 @@ static int selinux_inode_follow_link(struct dentry *dentry, struct inode *inode, | |||
2925 | if (IS_ERR(isec)) | 2925 | if (IS_ERR(isec)) |
2926 | return PTR_ERR(isec); | 2926 | return PTR_ERR(isec); |
2927 | 2927 | ||
2928 | return avc_has_perm_flags(&selinux_state, | 2928 | return avc_has_perm(&selinux_state, |
2929 | sid, isec->sid, isec->sclass, FILE__READ, &ad, | 2929 | sid, isec->sid, isec->sclass, FILE__READ, &ad); |
2930 | rcu ? MAY_NOT_BLOCK : 0); | ||
2931 | } | 2930 | } |
2932 | 2931 | ||
2933 | static noinline int audit_inode_permission(struct inode *inode, | 2932 | static noinline int audit_inode_permission(struct inode *inode, |
diff --git a/security/selinux/include/avc.h b/security/selinux/include/avc.h index 74ea50977c20..7be0e1e90e8b 100644 --- a/security/selinux/include/avc.h +++ b/security/selinux/include/avc.h | |||
@@ -153,11 +153,6 @@ int avc_has_perm(struct selinux_state *state, | |||
153 | u32 ssid, u32 tsid, | 153 | u32 ssid, u32 tsid, |
154 | u16 tclass, u32 requested, | 154 | u16 tclass, u32 requested, |
155 | struct common_audit_data *auditdata); | 155 | struct common_audit_data *auditdata); |
156 | int avc_has_perm_flags(struct selinux_state *state, | ||
157 | u32 ssid, u32 tsid, | ||
158 | u16 tclass, u32 requested, | ||
159 | struct common_audit_data *auditdata, | ||
160 | int flags); | ||
161 | 156 | ||
162 | int avc_has_extended_perms(struct selinux_state *state, | 157 | int avc_has_extended_perms(struct selinux_state *state, |
163 | u32 ssid, u32 tsid, u16 tclass, u32 requested, | 158 | u32 ssid, u32 tsid, u16 tclass, u32 requested, |