summaryrefslogtreecommitdiffstats
path: root/mm/fremap.c
diff options
context:
space:
mode:
authorHugh Dickins <hugh@veritas.com>2005-10-11 19:16:26 +0100
committerLinus Torvalds <torvalds@g5.osdl.org>2005-10-11 12:03:47 -0700
commitf5154a98a1931641f0448f6512294a15279110d7 (patch)
treefd5ea19514d07338f58b2df4b2f87922b9975a04 /mm/fremap.c
parent9149ccfa3571eaa4a4b444777d67fc4ed3ebcf27 (diff)
downloadkernel-crypto-f5154a98a1931641f0448f6512294a15279110d7.tar.gz
kernel-crypto-f5154a98a1931641f0448f6512294a15279110d7.tar.xz
kernel-crypto-f5154a98a1931641f0448f6512294a15279110d7.zip
[PATCH] Don't map the same page too much
Refuse to install a page into a mapping if the mapping count is already ridiculously large. You probably cannot trigger this on 32-bit architectures, but on a 64-bit setup we should protect against it. Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/fremap.c')
-rw-r--r--mm/fremap.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/mm/fremap.c b/mm/fremap.c
index 3235fb77c13..ab23a0673c3 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -89,6 +89,9 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma,
size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
if (!page->mapping || page->index >= size)
goto err_unlock;
+ err = -ENOMEM;
+ if (page_mapcount(page) > INT_MAX/2)
+ goto err_unlock;
zap_pte(mm, vma, addr, pte);