coredump/elf: Pass coredump_params into fill_note_info
authorEric W. Biederman <ebiederm@xmission.com>
Mon, 31 Jan 2022 18:17:38 +0000 (12:17 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:24:17 +0000 (14:24 +0200)
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>
fs/binfmt_elf.c

index bd6189f..1ae3fe3 100644 (file)
@@ -1799,7 +1799,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,
 
 static int fill_note_info(struct elfhdr *elf, int phdrs,
                          struct elf_note_info *info,
-                         const kernel_siginfo_t *siginfo, struct pt_regs *regs)
+                         struct coredump_params *cprm)
 {
        struct task_struct *dump_task = current;
        const struct user_regset_view *view = task_user_regset_view(dump_task);
@@ -1871,7 +1871,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
         * Now fill in each thread's information.
         */
        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;
 
        /*
@@ -1880,7 +1880,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
        fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
        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);
 
        fill_auxv_note(&info->auxv, current->mm);
@@ -2028,7 +2028,7 @@ static int elf_note_info_init(struct elf_note_info *info)
 
 static int fill_note_info(struct elfhdr *elf, int phdrs,
                          struct elf_note_info *info,
-                         const kernel_siginfo_t *siginfo, struct pt_regs *regs)
+                         struct coredump_params *cprm)
 {
        struct core_thread *ct;
        struct elf_thread_status *ets;
@@ -2049,13 +2049,13 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
        list_for_each_entry(ets, &info->thread_list, list) {
                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;
        }
        /* now collect the dump for the current */
        memset(info->prstatus, 0, sizeof(*info->prstatus));
-       fill_prstatus(&info->prstatus->common, current, siginfo->si_signo);
-       elf_core_copy_regs(&info->prstatus->pr_reg, regs);
+       fill_prstatus(&info->prstatus->common, current, cprm->siginfo->si_signo);
+       elf_core_copy_regs(&info->prstatus->pr_reg, cprm->regs);
 
        /* Set up header */
        fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
@@ -2071,7 +2071,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
        fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
                  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);
        info->numnote = 4;
 
@@ -2081,8 +2081,8 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
        }
 
        /* Try to dump the FPU. */
-       info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
-                                                              info->fpu);
+       info->prstatus->pr_fpvalid =
+               elf_core_copy_task_fpregs(current, cprm->regs, info->fpu);
        if (info->prstatus->pr_fpvalid)
                fill_note(info->notes + info->numnote++,
                          "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
@@ -2195,7 +2195,7 @@ static int elf_core_dump(struct coredump_params *cprm)
         * Collect all the non-memory information about the process for the
         * 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;
 
        has_dumped = 1;