summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Pomerantz <bapper@piratehaven.org>2007-04-01 23:49:41 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2007-04-13 13:47:18 -0700
commit8d6b75109e6c95fbb3d5e747f709e2e7633e6233 (patch)
tree9fa540e5eda83ea3c8e596fa7d1f0637d136cf71
parentc83d476c9dfc8306bd8578555d6ec462492cc707 (diff)
downloadlinux-stable-8d6b75109e6c95fbb3d5e747f709e2e7633e6233.tar.gz
linux-stable-8d6b75109e6c95fbb3d5e747f709e2e7633e6233.tar.bz2
linux-stable-8d6b75109e6c95fbb3d5e747f709e2e7633e6233.zip
fix page leak during core dump
When the dump cannot occur most likely because of a full file system and the page to be written is the zero page, the call to page_cache_release() is missed. Signed-off-by: Brian Pomerantz <bapper@mvista.com> Cc: Hugh Dickins <hugh@veritas.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: David Howells <dhowells@redhat.com> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--fs/binfmt_elf.c5
-rw-r--r--fs/binfmt_elf_fdpic.c2
2 files changed, 5 insertions, 2 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 51db1182b27e..b172b0160f5c 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -1704,7 +1704,10 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file)
DUMP_SEEK(PAGE_SIZE);
} else {
if (page == ZERO_PAGE(addr)) {
- DUMP_SEEK(PAGE_SIZE);
+ if (!dump_seek(file, PAGE_SIZE)) {
+ page_cache_release(page);
+ goto end_coredump;
+ }
} else {
void *kaddr;
flush_cache_page(vma, addr,
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index a4d933a51208..a852eb7b5a5d 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -1473,8 +1473,8 @@ static int elf_fdpic_dump_segments(struct file *file, struct mm_struct *mm,
DUMP_SEEK(file->f_pos + PAGE_SIZE);
}
else if (page == ZERO_PAGE(addr)) {
- DUMP_SEEK(file->f_pos + PAGE_SIZE);
page_cache_release(page);
+ DUMP_SEEK(file->f_pos + PAGE_SIZE);
}
else {
void *kaddr;