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)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 8 Mar 2022 19:01:52 +0000 (13:01 -0600)
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>
fs/binfmt_elf.c

index 5710467cf4b606a315d6f8df938a9f0b80cb61cd..7f0c391832cf3e858a40722e02b985d781ae0aa5 100644 (file)
@@ -1822,7 +1822,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);
@@ -1894,7 +1894,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;
 
        /*
@@ -1903,7 +1903,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);
@@ -2051,7 +2051,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;
@@ -2072,13 +2072,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);
@@ -2094,7 +2094,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;
 
@@ -2104,8 +2104,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);
@@ -2218,7 +2218,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;