diff options
Diffstat (limited to 'fs/binfmt_elf.c')
| -rw-r--r-- | fs/binfmt_elf.c | 44 |
1 files changed, 14 insertions, 30 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 7c1e65d54872..442d94fe255c 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
| @@ -1280,9 +1280,6 @@ static int writenote(struct memelfnote *men, struct file *file, | |||
| 1280 | #define DUMP_WRITE(addr, nr) \ | 1280 | #define DUMP_WRITE(addr, nr) \ |
| 1281 | if ((size += (nr)) > limit || !dump_write(file, (addr), (nr))) \ | 1281 | if ((size += (nr)) > limit || !dump_write(file, (addr), (nr))) \ |
| 1282 | goto end_coredump; | 1282 | goto end_coredump; |
| 1283 | #define DUMP_SEEK(off) \ | ||
| 1284 | if (!dump_seek(file, (off))) \ | ||
| 1285 | goto end_coredump; | ||
| 1286 | 1283 | ||
| 1287 | static void fill_elf_header(struct elfhdr *elf, int segs, | 1284 | static void fill_elf_header(struct elfhdr *elf, int segs, |
| 1288 | u16 machine, u32 flags, u8 osabi) | 1285 | u16 machine, u32 flags, u8 osabi) |
| @@ -2016,7 +2013,8 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file, un | |||
| 2016 | goto end_coredump; | 2013 | goto end_coredump; |
| 2017 | 2014 | ||
| 2018 | /* Align to page */ | 2015 | /* Align to page */ |
| 2019 | DUMP_SEEK(dataoff - foffset); | 2016 | if (!dump_seek(file, dataoff - foffset)) |
| 2017 | goto end_coredump; | ||
| 2020 | 2018 | ||
| 2021 | for (vma = first_vma(current, gate_vma); vma != NULL; | 2019 | for (vma = first_vma(current, gate_vma); vma != NULL; |
| 2022 | vma = next_vma(vma, gate_vma)) { | 2020 | vma = next_vma(vma, gate_vma)) { |
| @@ -2027,33 +2025,19 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file, un | |||
| 2027 | 2025 | ||
| 2028 | for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) { | 2026 | for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) { |
| 2029 | struct page *page; | 2027 | struct page *page; |
| 2030 | struct vm_area_struct *tmp_vma; | 2028 | int stop; |
| 2031 | 2029 | ||
| 2032 | if (get_user_pages(current, current->mm, addr, 1, 0, 1, | 2030 | page = get_dump_page(addr); |
| 2033 | &page, &tmp_vma) <= 0) { | 2031 | if (page) { |
| 2034 | DUMP_SEEK(PAGE_SIZE); | 2032 | void *kaddr = kmap(page); |
| 2035 | } else { | 2033 | stop = ((size += PAGE_SIZE) > limit) || |
| 2036 | if (page == ZERO_PAGE(0)) { | 2034 | !dump_write(file, kaddr, PAGE_SIZE); |
| 2037 | if (!dump_seek(file, PAGE_SIZE)) { | 2035 | kunmap(page); |
| 2038 | page_cache_release(page); | ||
| 2039 | goto end_coredump; | ||
| 2040 | } | ||
| 2041 | } else { | ||
| 2042 | void *kaddr; | ||
| 2043 | flush_cache_page(tmp_vma, addr, | ||
| 2044 | page_to_pfn(page)); | ||
| 2045 | kaddr = kmap(page); | ||
| 2046 | if ((size += PAGE_SIZE) > limit || | ||
| 2047 | !dump_write(file, kaddr, | ||
| 2048 | PAGE_SIZE)) { | ||
| 2049 | kunmap(page); | ||
| 2050 | page_cache_release(page); | ||
| 2051 | goto end_coredump; | ||
| 2052 | } | ||
| 2053 | kunmap(page); | ||
| 2054 | } | ||
| 2055 | page_cache_release(page); | 2036 | page_cache_release(page); |
| 2056 | } | 2037 | } else |
| 2038 | stop = !dump_seek(file, PAGE_SIZE); | ||
| 2039 | if (stop) | ||
| 2040 | goto end_coredump; | ||
| 2057 | } | 2041 | } |
| 2058 | } | 2042 | } |
| 2059 | 2043 | ||
