lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 081/134] Take mmap lock in cacheflush syscall
    Date
    From: Jann Horn <jannh@google.com>

    [ Upstream commit c26958cb5a0d9053d1358258827638773f3d36ed ]

    We need to take the mmap lock around find_vma() and subsequent use of the
    VMA. Otherwise, we can race with concurrent operations like munmap(), which
    can lead to use-after-free accesses to freed VMAs.

    Fixes: 1000197d8013 ("nios2: System calls handling")
    Signed-off-by: Jann Horn <jannh@google.com>
    Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/nios2/kernel/sys_nios2.c | 11 +++++++++--
    1 file changed, 9 insertions(+), 2 deletions(-)

    diff --git a/arch/nios2/kernel/sys_nios2.c b/arch/nios2/kernel/sys_nios2.c
    index cd390ec4f88bf..b1ca856999521 100644
    --- a/arch/nios2/kernel/sys_nios2.c
    +++ b/arch/nios2/kernel/sys_nios2.c
    @@ -22,6 +22,7 @@ asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len,
    unsigned int op)
    {
    struct vm_area_struct *vma;
    + struct mm_struct *mm = current->mm;

    if (len == 0)
    return 0;
    @@ -34,16 +35,22 @@ asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len,
    if (addr + len < addr)
    return -EFAULT;

    + if (mmap_read_lock_killable(mm))
    + return -EINTR;
    +
    /*
    * Verify that the specified address region actually belongs
    * to this process.
    */
    - vma = find_vma(current->mm, addr);
    - if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end)
    + vma = find_vma(mm, addr);
    + if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) {
    + mmap_read_unlock(mm);
    return -EFAULT;
    + }

    flush_cache_range(vma, addr, addr + len);

    + mmap_read_unlock(mm);
    return 0;
    }

    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-01 18:45    [W:5.939 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site