diff options
Diffstat (limited to 'fs/binfmt_elf_fdpic.c')
| -rw-r--r-- | fs/binfmt_elf_fdpic.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index 7b055385db8e..c25256a5c5b0 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c | |||
| @@ -76,7 +76,7 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *, | |||
| 76 | struct file *, struct mm_struct *); | 76 | struct file *, struct mm_struct *); |
| 77 | 77 | ||
| 78 | #ifdef CONFIG_ELF_CORE | 78 | #ifdef CONFIG_ELF_CORE |
| 79 | static int elf_fdpic_core_dump(long, struct pt_regs *, struct file *, unsigned long limit); | 79 | static int elf_fdpic_core_dump(struct coredump_params *cprm); |
| 80 | #endif | 80 | #endif |
| 81 | 81 | ||
| 82 | static struct linux_binfmt elf_fdpic_format = { | 82 | static struct linux_binfmt elf_fdpic_format = { |
| @@ -1326,8 +1326,9 @@ static int writenote(struct memelfnote *men, struct file *file) | |||
| 1326 | #undef DUMP_WRITE | 1326 | #undef DUMP_WRITE |
| 1327 | #undef DUMP_SEEK | 1327 | #undef DUMP_SEEK |
| 1328 | 1328 | ||
| 1329 | #define DUMP_WRITE(addr, nr) \ | 1329 | #define DUMP_WRITE(addr, nr) \ |
| 1330 | if ((size += (nr)) > limit || !dump_write(file, (addr), (nr))) \ | 1330 | if ((size += (nr)) > cprm->limit || \ |
| 1331 | !dump_write(cprm->file, (addr), (nr))) \ | ||
| 1331 | goto end_coredump; | 1332 | goto end_coredump; |
| 1332 | 1333 | ||
| 1333 | static inline void fill_elf_fdpic_header(struct elfhdr *elf, int segs) | 1334 | static inline void fill_elf_fdpic_header(struct elfhdr *elf, int segs) |
| @@ -1582,8 +1583,7 @@ static int elf_fdpic_dump_segments(struct file *file, size_t *size, | |||
| 1582 | * and then they are actually written out. If we run out of core limit | 1583 | * and then they are actually written out. If we run out of core limit |
| 1583 | * we just truncate. | 1584 | * we just truncate. |
| 1584 | */ | 1585 | */ |
| 1585 | static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, | 1586 | static int elf_fdpic_core_dump(struct coredump_params *cprm) |
| 1586 | struct file *file, unsigned long limit) | ||
| 1587 | { | 1587 | { |
| 1588 | #define NUM_NOTES 6 | 1588 | #define NUM_NOTES 6 |
| 1589 | int has_dumped = 0; | 1589 | int has_dumped = 0; |
| @@ -1642,7 +1642,7 @@ static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, | |||
| 1642 | goto cleanup; | 1642 | goto cleanup; |
| 1643 | #endif | 1643 | #endif |
| 1644 | 1644 | ||
| 1645 | if (signr) { | 1645 | if (cprm->signr) { |
| 1646 | struct core_thread *ct; | 1646 | struct core_thread *ct; |
| 1647 | struct elf_thread_status *tmp; | 1647 | struct elf_thread_status *tmp; |
| 1648 | 1648 | ||
| @@ -1661,14 +1661,14 @@ static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, | |||
| 1661 | int sz; | 1661 | int sz; |
| 1662 | 1662 | ||
| 1663 | tmp = list_entry(t, struct elf_thread_status, list); | 1663 | tmp = list_entry(t, struct elf_thread_status, list); |
| 1664 | sz = elf_dump_thread_status(signr, tmp); | 1664 | sz = elf_dump_thread_status(cprm->signr, tmp); |
| 1665 | thread_status_size += sz; | 1665 | thread_status_size += sz; |
| 1666 | } | 1666 | } |
| 1667 | } | 1667 | } |
| 1668 | 1668 | ||
| 1669 | /* now collect the dump for the current */ | 1669 | /* now collect the dump for the current */ |
| 1670 | fill_prstatus(prstatus, current, signr); | 1670 | fill_prstatus(prstatus, current, cprm->signr); |
| 1671 | elf_core_copy_regs(&prstatus->pr_reg, regs); | 1671 | elf_core_copy_regs(&prstatus->pr_reg, cprm->regs); |
| 1672 | 1672 | ||
| 1673 | segs = current->mm->map_count; | 1673 | segs = current->mm->map_count; |
| 1674 | #ifdef ELF_CORE_EXTRA_PHDRS | 1674 | #ifdef ELF_CORE_EXTRA_PHDRS |
| @@ -1703,7 +1703,7 @@ static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, | |||
| 1703 | 1703 | ||
| 1704 | /* Try to dump the FPU. */ | 1704 | /* Try to dump the FPU. */ |
| 1705 | if ((prstatus->pr_fpvalid = | 1705 | if ((prstatus->pr_fpvalid = |
| 1706 | elf_core_copy_task_fpregs(current, regs, fpu))) | 1706 | elf_core_copy_task_fpregs(current, cprm->regs, fpu))) |
| 1707 | fill_note(notes + numnote++, | 1707 | fill_note(notes + numnote++, |
| 1708 | "CORE", NT_PRFPREG, sizeof(*fpu), fpu); | 1708 | "CORE", NT_PRFPREG, sizeof(*fpu), fpu); |
| 1709 | #ifdef ELF_CORE_COPY_XFPREGS | 1709 | #ifdef ELF_CORE_COPY_XFPREGS |
| @@ -1774,7 +1774,7 @@ static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, | |||
| 1774 | 1774 | ||
| 1775 | /* write out the notes section */ | 1775 | /* write out the notes section */ |
| 1776 | for (i = 0; i < numnote; i++) | 1776 | for (i = 0; i < numnote; i++) |
| 1777 | if (!writenote(notes + i, file)) | 1777 | if (!writenote(notes + i, cprm->file)) |
| 1778 | goto end_coredump; | 1778 | goto end_coredump; |
| 1779 | 1779 | ||
| 1780 | /* write out the thread status notes section */ | 1780 | /* write out the thread status notes section */ |
| @@ -1783,14 +1783,15 @@ static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, | |||
| 1783 | list_entry(t, struct elf_thread_status, list); | 1783 | list_entry(t, struct elf_thread_status, list); |
| 1784 | 1784 | ||
| 1785 | for (i = 0; i < tmp->num_notes; i++) | 1785 | for (i = 0; i < tmp->num_notes; i++) |
| 1786 | if (!writenote(&tmp->notes[i], file)) | 1786 | if (!writenote(&tmp->notes[i], cprm->file)) |
| 1787 | goto end_coredump; | 1787 | goto end_coredump; |
| 1788 | } | 1788 | } |
| 1789 | 1789 | ||
| 1790 | if (!dump_seek(file, dataoff)) | 1790 | if (!dump_seek(cprm->file, dataoff)) |
| 1791 | goto end_coredump; | 1791 | goto end_coredump; |
| 1792 | 1792 | ||
| 1793 | if (elf_fdpic_dump_segments(file, &size, &limit, mm_flags) < 0) | 1793 | if (elf_fdpic_dump_segments(cprm->file, &size, &cprm->limit, |
| 1794 | mm_flags) < 0) | ||
| 1794 | goto end_coredump; | 1795 | goto end_coredump; |
| 1795 | 1796 | ||
| 1796 | #ifdef ELF_CORE_WRITE_EXTRA_DATA | 1797 | #ifdef ELF_CORE_WRITE_EXTRA_DATA |
