Skip to content

Commit

Permalink
coredump: refactor page range dumping into common helper
Browse files Browse the repository at this point in the history
Both fs/binfmt_elf.c and fs/binfmt_elf_fdpic.c need to dump ranges of
pages into the coredump file.  Extract that logic into a common helper.

Signed-off-by: Jann Horn <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Acked-by: Linus Torvalds <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Alexander Viro <[email protected]>
Cc: "Eric W . Biederman" <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Hugh Dickins <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
thejh authored and torvalds committed Oct 16, 2020
1 parent df0c09c commit afc63a9
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 35 deletions.
22 changes: 2 additions & 20 deletions fs/binfmt_elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -2444,26 +2444,8 @@ static int elf_core_dump(struct coredump_params *cprm)

for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
vma = next_vma(vma, gate_vma)) {
unsigned long addr;
unsigned long end;

end = vma->vm_start + vma_filesz[i++];

for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
struct page *page;
int stop;

page = get_dump_page(addr);
if (page) {
void *kaddr = kmap(page);
stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
kunmap(page);
put_page(page);
} else
stop = !dump_skip(cprm, PAGE_SIZE);
if (stop)
goto end_coredump;
}
if (!dump_user_range(cprm, vma->vm_start, vma_filesz[i++]))
goto end_coredump;
}
dump_truncate(cprm);

Expand Down
18 changes: 3 additions & 15 deletions fs/binfmt_elf_fdpic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1534,21 +1534,9 @@ static bool elf_fdpic_dump_segments(struct coredump_params *cprm)
if (!maydump(vma, cprm->mm_flags))
continue;

for (addr = vma->vm_start; addr < vma->vm_end;
addr += PAGE_SIZE) {
bool res;
struct page *page = get_dump_page(addr);
if (page) {
void *kaddr = kmap(page);
res = dump_emit(cprm, kaddr, PAGE_SIZE);
kunmap(page);
put_page(page);
} else {
res = dump_skip(cprm, PAGE_SIZE);
}
if (!res)
return false;
}
if (!dump_user_range(cprm, vma->vm_start,
vma->vma_end - vma->vm_start))
return false;
}
return true;
}
Expand Down
34 changes: 34 additions & 0 deletions fs/coredump.c
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,40 @@ int dump_skip(struct coredump_params *cprm, size_t nr)
}
EXPORT_SYMBOL(dump_skip);

#ifdef CONFIG_ELF_CORE
int dump_user_range(struct coredump_params *cprm, unsigned long start,
unsigned long len)
{
unsigned long addr;

for (addr = start; addr < start + len; addr += PAGE_SIZE) {
struct page *page;
int stop;

/*
* To avoid having to allocate page tables for virtual address
* ranges that have never been used yet, and also to make it
* easy to generate sparse core files, use a helper that returns
* NULL when encountering an empty page table entry that would
* otherwise have been filled with the zero page.
*/
page = get_dump_page(addr);
if (page) {
void *kaddr = kmap(page);

stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
kunmap(page);
put_page(page);
} else {
stop = !dump_skip(cprm, PAGE_SIZE);
}
if (stop)
return 0;
}
return 1;
}
#endif

int dump_align(struct coredump_params *cprm, int align)
{
unsigned mod = cprm->pos & (align - 1);
Expand Down
2 changes: 2 additions & 0 deletions include/linux/coredump.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ extern int dump_skip(struct coredump_params *cprm, size_t nr);
extern int dump_emit(struct coredump_params *cprm, const void *addr, int nr);
extern int dump_align(struct coredump_params *cprm, int align);
extern void dump_truncate(struct coredump_params *cprm);
int dump_user_range(struct coredump_params *cprm, unsigned long start,
unsigned long len);
#ifdef CONFIG_COREDUMP
extern void do_coredump(const kernel_siginfo_t *siginfo);
#else
Expand Down

0 comments on commit afc63a9

Please sign in to comment.