lkml.org 
[lkml]   [2013]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 63/74] mm/pagewalk.c: fix walk_page_range() access of wrong PTEs
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Chen LinX <linx.z.chen@intel.com>

    commit 3017f079efd6af199b0852b5c425364513db460e upstream.

    When walk_page_range walk a memory map's page tables, it'll skip
    VM_PFNMAP area, then variable 'next' will to assign to vma->vm_end, it
    maybe larger than 'end'. In next loop, 'addr' will be larger than
    'next'. Then in /proc/XXXX/pagemap file reading procedure, the 'addr'
    will growing forever in pagemap_pte_range, pte_to_pagemap_entry will
    access the wrong pte.

    BUG: Bad page map in process procrank pte:8437526f pmd:785de067
    addr:9108d000 vm_flags:00200073 anon_vma:f0d99020 mapping: (null) index:9108d
    CPU: 1 PID: 4974 Comm: procrank Tainted: G B W O 3.10.1+ #1
    Call Trace:
    dump_stack+0x16/0x18
    print_bad_pte+0x114/0x1b0
    vm_normal_page+0x56/0x60
    pagemap_pte_range+0x17a/0x1d0
    walk_page_range+0x19e/0x2c0
    pagemap_read+0x16e/0x200
    vfs_read+0x84/0x150
    SyS_read+0x4a/0x80
    syscall_call+0x7/0xb

    Signed-off-by: Liu ShuoX <shuox.liu@intel.com>
    Signed-off-by: Chen LinX <linx.z.chen@intel.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    mm/pagewalk.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/mm/pagewalk.c
    +++ b/mm/pagewalk.c
    @@ -242,7 +242,7 @@ int walk_page_range(unsigned long addr,
    if (err)
    break;
    pgd++;
    - } while (addr = next, addr != end);
    + } while (addr = next, addr < end);

    return err;
    }



    \
     
     \ /
      Last update: 2013-11-09 10:21    [W:4.246 / U:0.492 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site