diff options
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 12 | 
1 files changed, 11 insertions, 1 deletions
| diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 55c78c318ccd..bfa61e005aac 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -3852,7 +3852,17 @@ static int selinux_file_mprotect(struct vm_area_struct *vma,  	if (default_noexec &&  	    (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {  		int rc = 0; -		if (vma_is_initial_heap(vma)) { +		/* +		 * We don't use the vma_is_initial_heap() helper as it has +		 * a history of problems and is currently broken on systems +		 * where there is no heap, e.g. brk == start_brk.  Before +		 * replacing the conditional below with vma_is_initial_heap(), +		 * or something similar, please ensure that the logic is the +		 * same as what we have below or you have tested every possible +		 * corner case you can think to test. +		 */ +		if (vma->vm_start >= vma->vm_mm->start_brk && +		    vma->vm_end <= vma->vm_mm->brk) {  			rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,  					  PROCESS__EXECHEAP, NULL);  		} else if (!vma->vm_file && (vma_is_initial_stack(vma) || |