This reverts commit 68df1baf158fddc07b6f0333e4c81fe1ccecd6ff. The selinux only want to check whether the VMA range is within the heap range or not, but vma_is_initial_heap() helper will check the intersection between the two ranges, which leads to some issue, let's turn back to the original validation. Reported-by: Marc Reisner <reisner.marc@xxxxxxxxx> Closes: https://lore.kernel.org/all/ZrPmoLKJEf1wiFmM@xxxxxxxxxxxxxxx/ Fixes: 68df1baf158f ("selinux: use vma_is_initial_stack() and vma_is_initial_heap()") Signed-off-by: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> --- security/selinux/hooks.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 81fbfa5b80d4..f5805d4b0aec 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -3845,10 +3845,13 @@ 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)) { + 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) || + } else if (!vma->vm_file && + ((vma->vm_start <= vma->vm_mm->start_stack && + vma->vm_end >= vma->vm_mm->start_stack) || vma_is_stack_for_current(vma))) { rc = avc_has_perm(sid, sid, SECCLASS_PROCESS, PROCESS__EXECSTACK, NULL); -- 2.41.0