diff options
Diffstat (limited to 'sys/security/mac_mls/mac_mls.c')
| -rw-r--r-- | sys/security/mac_mls/mac_mls.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/sys/security/mac_mls/mac_mls.c b/sys/security/mac_mls/mac_mls.c index 0b1e2ef91f5f..7fb2c782f8c4 100644 --- a/sys/security/mac_mls/mac_mls.c +++ b/sys/security/mac_mls/mac_mls.c @@ -1525,6 +1525,34 @@ mac_mls_check_vnode_lookup(struct ucred *cred, struct vnode *dvp, } static int +mac_mls_check_vnode_mmap(struct ucred *cred, struct vnode *vp, + struct label *label, int prot) +{ + struct mac_mls *subj, *obj; + + /* + * Rely on the use of open()-time protections to handle + * non-revocation cases. + */ + if (!mac_mls_enabled || !mac_mls_revocation_enabled) + return (0); + + subj = SLOT(&cred->cr_label); + obj = SLOT(label); + + if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) { + if (!mac_mls_dominate_single(subj, obj)) + return (EACCES); + } + if (prot & VM_PROT_WRITE) { + if (!mac_mls_dominate_single(obj, subj)) + return (EACCES); + } + + return (0); +} + +static int mac_mls_check_vnode_open(struct ucred *cred, struct vnode *vp, struct label *vnodelabel, mode_t acc_mode) { @@ -1871,26 +1899,6 @@ mac_mls_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, return (0); } -static vm_prot_t -mac_mls_check_vnode_mmap_perms(struct ucred *cred, struct vnode *vp, - struct label *label, int newmapping) -{ - struct mac_mls *subj, *obj; - vm_prot_t prot = 0; - - if (!mac_mls_enabled || (!mac_mls_revocation_enabled && !newmapping)) - return (VM_PROT_ALL); - - subj = SLOT(&cred->cr_label); - obj = SLOT(label); - - if (mac_mls_dominate_single(subj, obj)) - prot |= VM_PROT_READ | VM_PROT_EXECUTE; - if (mac_mls_dominate_single(obj, subj)) - prot |= VM_PROT_WRITE; - return (prot); -} - static struct mac_policy_op_entry mac_mls_ops[] = { { MAC_DESTROY, @@ -2091,6 +2099,10 @@ static struct mac_policy_op_entry mac_mls_ops[] = (macop_t)mac_mls_check_vnode_link }, { MAC_CHECK_VNODE_LOOKUP, (macop_t)mac_mls_check_vnode_lookup }, + { MAC_CHECK_VNODE_MMAP, + (macop_t)mac_mls_check_vnode_mmap }, + { MAC_CHECK_VNODE_MPROTECT, + (macop_t)mac_mls_check_vnode_mmap }, { MAC_CHECK_VNODE_OPEN, (macop_t)mac_mls_check_vnode_open }, { MAC_CHECK_VNODE_POLL, @@ -2125,8 +2137,6 @@ static struct mac_policy_op_entry mac_mls_ops[] = (macop_t)mac_mls_check_vnode_stat }, { MAC_CHECK_VNODE_WRITE, (macop_t)mac_mls_check_vnode_write }, - { MAC_CHECK_VNODE_MMAP_PERMS, - (macop_t)mac_mls_check_vnode_mmap_perms }, { MAC_OP_LAST, NULL } }; |
