coredump/elf: Pass coredump_params into fill_note_info
commit 9ec7d3230717b4fe9b6c7afeb4811909c23fa1d7 upstream. Instead of individually passing cprm->siginfo and cprm->regs into fill_note_info pass all of struct coredump_params. This is preparation to allow fill_files_note to use the existing vma snapshot. Reviewed-by: Jann Horn <jannh@google.com> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
b043ae637a
commit
b7933f145a
@@ -1797,7 +1797,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,
|
|||||||
|
|
||||||
static int fill_note_info(struct elfhdr *elf, int phdrs,
|
static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||||
struct elf_note_info *info,
|
struct elf_note_info *info,
|
||||||
const kernel_siginfo_t *siginfo, struct pt_regs *regs)
|
struct coredump_params *cprm)
|
||||||
{
|
{
|
||||||
struct task_struct *dump_task = current;
|
struct task_struct *dump_task = current;
|
||||||
const struct user_regset_view *view = task_user_regset_view(dump_task);
|
const struct user_regset_view *view = task_user_regset_view(dump_task);
|
||||||
@@ -1869,7 +1869,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
|||||||
* Now fill in each thread's information.
|
* Now fill in each thread's information.
|
||||||
*/
|
*/
|
||||||
for (t = info->thread; t != NULL; t = t->next)
|
for (t = info->thread; t != NULL; t = t->next)
|
||||||
if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
|
if (!fill_thread_core_info(t, view, cprm->siginfo->si_signo, &info->size))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1878,7 +1878,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
|||||||
fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
|
fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
|
||||||
info->size += notesize(&info->psinfo);
|
info->size += notesize(&info->psinfo);
|
||||||
|
|
||||||
fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
|
fill_siginfo_note(&info->signote, &info->csigdata, cprm->siginfo);
|
||||||
info->size += notesize(&info->signote);
|
info->size += notesize(&info->signote);
|
||||||
|
|
||||||
fill_auxv_note(&info->auxv, current->mm);
|
fill_auxv_note(&info->auxv, current->mm);
|
||||||
@@ -2026,7 +2026,7 @@ static int elf_note_info_init(struct elf_note_info *info)
|
|||||||
|
|
||||||
static int fill_note_info(struct elfhdr *elf, int phdrs,
|
static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||||
struct elf_note_info *info,
|
struct elf_note_info *info,
|
||||||
const kernel_siginfo_t *siginfo, struct pt_regs *regs)
|
struct coredump_params *cprm)
|
||||||
{
|
{
|
||||||
struct core_thread *ct;
|
struct core_thread *ct;
|
||||||
struct elf_thread_status *ets;
|
struct elf_thread_status *ets;
|
||||||
@@ -2047,13 +2047,13 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
|||||||
list_for_each_entry(ets, &info->thread_list, list) {
|
list_for_each_entry(ets, &info->thread_list, list) {
|
||||||
int sz;
|
int sz;
|
||||||
|
|
||||||
sz = elf_dump_thread_status(siginfo->si_signo, ets);
|
sz = elf_dump_thread_status(cprm->siginfo->si_signo, ets);
|
||||||
info->thread_status_size += sz;
|
info->thread_status_size += sz;
|
||||||
}
|
}
|
||||||
/* now collect the dump for the current */
|
/* now collect the dump for the current */
|
||||||
memset(info->prstatus, 0, sizeof(*info->prstatus));
|
memset(info->prstatus, 0, sizeof(*info->prstatus));
|
||||||
fill_prstatus(info->prstatus, current, siginfo->si_signo);
|
fill_prstatus(info->prstatus, current, cprm->siginfo->si_signo);
|
||||||
elf_core_copy_regs(&info->prstatus->pr_reg, regs);
|
elf_core_copy_regs(&info->prstatus->pr_reg, cprm->regs);
|
||||||
|
|
||||||
/* Set up header */
|
/* Set up header */
|
||||||
fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
|
fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
|
||||||
@@ -2069,7 +2069,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
|||||||
fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
|
fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
|
||||||
sizeof(*info->psinfo), info->psinfo);
|
sizeof(*info->psinfo), info->psinfo);
|
||||||
|
|
||||||
fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
|
fill_siginfo_note(info->notes + 2, &info->csigdata, cprm->siginfo);
|
||||||
fill_auxv_note(info->notes + 3, current->mm);
|
fill_auxv_note(info->notes + 3, current->mm);
|
||||||
info->numnote = 4;
|
info->numnote = 4;
|
||||||
|
|
||||||
@@ -2079,8 +2079,8 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Try to dump the FPU. */
|
/* Try to dump the FPU. */
|
||||||
info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
|
info->prstatus->pr_fpvalid =
|
||||||
info->fpu);
|
elf_core_copy_task_fpregs(current, cprm->regs, info->fpu);
|
||||||
if (info->prstatus->pr_fpvalid)
|
if (info->prstatus->pr_fpvalid)
|
||||||
fill_note(info->notes + info->numnote++,
|
fill_note(info->notes + info->numnote++,
|
||||||
"CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
|
"CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
|
||||||
@@ -2193,7 +2193,7 @@ static int elf_core_dump(struct coredump_params *cprm)
|
|||||||
* Collect all the non-memory information about the process for the
|
* Collect all the non-memory information about the process for the
|
||||||
* notes. This also sets up the file header.
|
* notes. This also sets up the file header.
|
||||||
*/
|
*/
|
||||||
if (!fill_note_info(&elf, e_phnum, &info, cprm->siginfo, cprm->regs))
|
if (!fill_note_info(&elf, e_phnum, &info, cprm))
|
||||||
goto end_coredump;
|
goto end_coredump;
|
||||||
|
|
||||||
has_dumped = 1;
|
has_dumped = 1;
|
||||||
|
Reference in New Issue
Block a user