coredump: pass siginfo_t* to do_coredump() and below, not merely signr
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 5 Oct 2012 00:15:29 +0000 (17:15 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Oct 2012 18:05:16 +0000 (03:05 +0900)
This is a preparatory patch for the introduction of NT_SIGINFO elf note.

With this patch we pass "siginfo_t *siginfo" instead of "int signr" to
do_coredump() and put it into coredump_params.  It will be used by the
next patch.  Most changes are simple s/signr/siginfo->si_signo/.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Cc: Amerigo Wang <amwang@redhat.com>
Cc: "Jonathan M. Foote" <jmfoote@cert.org>
Cc: Roland McGrath <roland@hack.frob.com>
Cc: Pedro Alves <palves@redhat.com>
Cc: Fengguang Wu <fengguang.wu@intel.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/binfmt_aout.c
fs/binfmt_elf.c
fs/binfmt_elf_fdpic.c
fs/binfmt_flat.c
fs/coredump.c
include/linux/binfmts.h
include/linux/coredump.h
kernel/signal.c

index 4b5b5117f00aff7a7ad707bc3c50ecce4e9c92ca..0e7a6f81ae36c0d9b57b36550ea58705675bd9f1 100644 (file)
@@ -65,7 +65,7 @@ static int aout_core_dump(struct coredump_params *cprm)
        current->flags |= PF_DUMPCORE;
                strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
        dump.u_ar0 = offsetof(struct user, regs);
-       dump.signal = cprm->signr;
+       dump.signal = cprm->siginfo->si_signo;
        aout_dump_thread(cprm->regs, &dump);
 
 /* If the size of the dump file exceeds the rlimit, then see what would happen
index 7ef5f9fe2729aa29c3554cc7858494f4d463fb2a..4450e82a05aab4ae95f77f78fa8504a53b2f04cf 100644 (file)
@@ -1480,7 +1480,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,
-                         long signr, struct pt_regs *regs)
+                         siginfo_t *siginfo, struct pt_regs *regs)
 {
        struct task_struct *dump_task = current;
        const struct user_regset_view *view = task_user_regset_view(dump_task);
@@ -1550,7 +1550,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, signr, &info->size))
+               if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
                        return 0;
 
        /*
@@ -1713,14 +1713,14 @@ 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,
-                         long signr, struct pt_regs *regs)
+                         siginfo_t *siginfo, struct pt_regs *regs)
 {
        struct list_head *t;
 
        if (!elf_note_info_init(info))
                return 0;
 
-       if (signr) {
+       if (siginfo->si_signo) {
                struct core_thread *ct;
                struct elf_thread_status *ets;
 
@@ -1738,13 +1738,13 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
                        int sz;
 
                        ets = list_entry(t, struct elf_thread_status, list);
-                       sz = elf_dump_thread_status(signr, ets);
+                       sz = elf_dump_thread_status(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, current, signr);
+       fill_prstatus(info->prstatus, current, siginfo->si_signo);
        elf_core_copy_regs(&info->prstatus->pr_reg, regs);
 
        /* Set up header */
@@ -1951,7 +1951,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->signr, cprm->regs))
+       if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
                goto cleanup;
 
        has_dumped = 1;
index 3d77cf81ba3c82c8dbe7d80531e34bea4355250c..08d812b3228262650473fc4ef0599a47cc898f65 100644 (file)
@@ -1642,7 +1642,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
                goto cleanup;
 #endif
 
-       if (cprm->signr) {
+       if (cprm->siginfo->si_signo) {
                struct core_thread *ct;
                struct elf_thread_status *tmp;
 
@@ -1661,13 +1661,13 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
                        int sz;
 
                        tmp = list_entry(t, struct elf_thread_status, list);
-                       sz = elf_dump_thread_status(cprm->signr, tmp);
+                       sz = elf_dump_thread_status(cprm->siginfo->si_signo, tmp);
                        thread_status_size += sz;
                }
        }
 
        /* now collect the dump for the current */
-       fill_prstatus(prstatus, current, cprm->signr);
+       fill_prstatus(prstatus, current, cprm->siginfo->si_signo);
        elf_core_copy_regs(&prstatus->pr_reg, cprm->regs);
 
        segs = current->mm->map_count;
index 178cb70acc26de80ec3db21a8455e88b7fc0360b..e280352b28f9e48adab2cc8d94963b0cbaf8b181 100644 (file)
@@ -107,7 +107,7 @@ static struct linux_binfmt flat_format = {
 static int flat_core_dump(struct coredump_params *cprm)
 {
        printk("Process %s:%d received signr %d and should have core dumped\n",
-                       current->comm, current->pid, (int) cprm->signr);
+                       current->comm, current->pid, (int) cprm->siginfo->si_signo);
        return(1);
 }
 
index 4fce06fc3b56dceaacaa0fd690481991449040de..fd37facac8dc55f40281008ceb6799c667105588 100644 (file)
@@ -200,7 +200,7 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm)
                                break;
                        /* signal that caused the coredump */
                        case 's':
-                               err = cn_printf(cn, "%ld", cprm->signr);
+                               err = cn_printf(cn, "%ld", cprm->siginfo->si_signo);
                                break;
                        /* UNIX time of coredump */
                        case 't': {
@@ -457,7 +457,7 @@ static int umh_pipe_setup(struct subprocess_info *info, struct cred *new)
        return 0;
 }
 
-void do_coredump(long signr, int exit_code, struct pt_regs *regs)
+void do_coredump(siginfo_t *siginfo, struct pt_regs *regs)
 {
        struct core_state core_state;
        struct core_name cn;
@@ -472,7 +472,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
        bool need_nonrelative = false;
        static atomic_t core_dump_count = ATOMIC_INIT(0);
        struct coredump_params cprm = {
-               .signr = signr,
+               .siginfo = siginfo,
                .regs = regs,
                .limit = rlimit(RLIMIT_CORE),
                /*
@@ -483,7 +483,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
                .mm_flags = mm->flags,
        };
 
-       audit_core_dumps(signr);
+       audit_core_dumps(siginfo->si_signo);
 
        binfmt = mm->binfmt;
        if (!binfmt || !binfmt->core_dump)
@@ -507,7 +507,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
                need_nonrelative = true;
        }
 
-       retval = coredump_wait(exit_code, &core_state);
+       retval = coredump_wait(siginfo->si_signo, &core_state);
        if (retval < 0)
                goto fail_creds;
 
index c7b16ee71415f274c0bdc2895687d94b2ec29e7c..37935c2d2e8f1eb1a4b071a38e3af6fd14bb1296 100644 (file)
@@ -72,7 +72,7 @@ struct linux_binprm {
 
 /* Function parameter for binfmt->coredump */
 struct coredump_params {
-       long signr;
+       siginfo_t *siginfo;
        struct pt_regs *regs;
        struct file *file;
        unsigned long limit;
index 42f9752a0a404f900569c1f25a6caef55661cf74..1775eb8acc03665d36bf8b094c440a41ba10764d 100644 (file)
@@ -12,9 +12,9 @@
 extern int dump_write(struct file *file, const void *addr, int nr);
 extern int dump_seek(struct file *file, loff_t off);
 #ifdef CONFIG_COREDUMP
-extern void do_coredump(long signr, int exit_code, struct pt_regs *regs);
+extern void do_coredump(siginfo_t *siginfo, struct pt_regs *regs);
 #else
-static inline void do_coredump(long signr, int exit_code, struct pt_regs *regs) {}
+static inline void do_coredump(siginfo_t *siginfo, struct pt_regs *regs) {}
 #endif
 
 #endif /* _LINUX_COREDUMP_H */
index 2ad3f5904bd7f0e11b2b4db927db687083ab86c2..0af8868525d6d1853acfa77eb9f224566ccfb313 100644 (file)
@@ -2360,7 +2360,7 @@ relock:
                         * first and our do_group_exit call below will use
                         * that value and ignore the one we pass it.
                         */
-                       do_coredump(info->si_signo, info->si_signo, regs);
+                       do_coredump(info, regs);
                }
 
                /*