| From a8f531ebc33052642b4bd7b812eedf397108ce64 Mon Sep 17 00:00:00 2001 |
| From: Libin <huawei.libin@huawei.com> |
| Date: Wed, 11 Sep 2013 14:20:38 -0700 |
| Subject: mm/huge_memory.c: fix potential NULL pointer dereference |
| |
| From: Libin <huawei.libin@huawei.com> |
| |
| commit a8f531ebc33052642b4bd7b812eedf397108ce64 upstream. |
| |
| In collapse_huge_page() there is a race window between releasing the |
| mmap_sem read lock and taking the mmap_sem write lock, so find_vma() may |
| return NULL. So check the return value to avoid NULL pointer dereference. |
| |
| collapse_huge_page |
| khugepaged_alloc_page |
| up_read(&mm->mmap_sem) |
| down_write(&mm->mmap_sem) |
| vma = find_vma(mm, address) |
| |
| Signed-off-by: Libin <huawei.libin@huawei.com> |
| Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> |
| Reviewed-by: Wanpeng Li <liwanp@linux.vnet.ibm.com> |
| Reviewed-by: Michal Hocko <mhocko@suse.cz> |
| 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/huge_memory.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/mm/huge_memory.c |
| +++ b/mm/huge_memory.c |
| @@ -1838,6 +1838,8 @@ static void collapse_huge_page(struct mm |
| goto out; |
| |
| vma = find_vma(mm, address); |
| + if (!vma) |
| + goto out; |
| hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; |
| hend = vma->vm_end & HPAGE_PMD_MASK; |
| if (address < hstart || address + HPAGE_PMD_SIZE > hend) |