coredump: pass siginfo_t* to do_coredump() and below, not merely signr
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>
This commit is contained in:
Родитель
0f4cfb2e4e
Коммит
5ab1c309b3
|
@ -65,7 +65,7 @@ static int aout_core_dump(struct coredump_params *cprm)
|
||||||
current->flags |= PF_DUMPCORE;
|
current->flags |= PF_DUMPCORE;
|
||||||
strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
|
strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
|
||||||
dump.u_ar0 = offsetof(struct user, regs);
|
dump.u_ar0 = offsetof(struct user, regs);
|
||||||
dump.signal = cprm->signr;
|
dump.signal = cprm->siginfo->si_signo;
|
||||||
aout_dump_thread(cprm->regs, &dump);
|
aout_dump_thread(cprm->regs, &dump);
|
||||||
|
|
||||||
/* If the size of the dump file exceeds the rlimit, then see what would happen
|
/* If the size of the dump file exceeds the rlimit, then see what would happen
|
||||||
|
|
|
@ -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,
|
static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||||
struct elf_note_info *info,
|
struct elf_note_info *info,
|
||||||
long signr, struct pt_regs *regs)
|
siginfo_t *siginfo, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
@ -1550,7 +1550,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, signr, &info->size))
|
if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
|
||||||
return 0;
|
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,
|
static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||||
struct elf_note_info *info,
|
struct elf_note_info *info,
|
||||||
long signr, struct pt_regs *regs)
|
siginfo_t *siginfo, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct list_head *t;
|
struct list_head *t;
|
||||||
|
|
||||||
if (!elf_note_info_init(info))
|
if (!elf_note_info_init(info))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (signr) {
|
if (siginfo->si_signo) {
|
||||||
struct core_thread *ct;
|
struct core_thread *ct;
|
||||||
struct elf_thread_status *ets;
|
struct elf_thread_status *ets;
|
||||||
|
|
||||||
|
@ -1738,13 +1738,13 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||||
int sz;
|
int sz;
|
||||||
|
|
||||||
ets = list_entry(t, struct elf_thread_status, list);
|
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;
|
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, signr);
|
fill_prstatus(info->prstatus, current, siginfo->si_signo);
|
||||||
elf_core_copy_regs(&info->prstatus->pr_reg, regs);
|
elf_core_copy_regs(&info->prstatus->pr_reg, regs);
|
||||||
|
|
||||||
/* Set up header */
|
/* 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
|
* 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->signr, cprm->regs))
|
if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
has_dumped = 1;
|
has_dumped = 1;
|
||||||
|
|
|
@ -1642,7 +1642,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (cprm->signr) {
|
if (cprm->siginfo->si_signo) {
|
||||||
struct core_thread *ct;
|
struct core_thread *ct;
|
||||||
struct elf_thread_status *tmp;
|
struct elf_thread_status *tmp;
|
||||||
|
|
||||||
|
@ -1661,13 +1661,13 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
|
||||||
int sz;
|
int sz;
|
||||||
|
|
||||||
tmp = list_entry(t, struct elf_thread_status, list);
|
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;
|
thread_status_size += sz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now collect the dump for the current */
|
/* 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);
|
elf_core_copy_regs(&prstatus->pr_reg, cprm->regs);
|
||||||
|
|
||||||
segs = current->mm->map_count;
|
segs = current->mm->map_count;
|
||||||
|
|
|
@ -107,7 +107,7 @@ static struct linux_binfmt flat_format = {
|
||||||
static int flat_core_dump(struct coredump_params *cprm)
|
static int flat_core_dump(struct coredump_params *cprm)
|
||||||
{
|
{
|
||||||
printk("Process %s:%d received signr %d and should have core dumped\n",
|
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);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -200,7 +200,7 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm)
|
||||||
break;
|
break;
|
||||||
/* signal that caused the coredump */
|
/* signal that caused the coredump */
|
||||||
case 's':
|
case 's':
|
||||||
err = cn_printf(cn, "%ld", cprm->signr);
|
err = cn_printf(cn, "%ld", cprm->siginfo->si_signo);
|
||||||
break;
|
break;
|
||||||
/* UNIX time of coredump */
|
/* UNIX time of coredump */
|
||||||
case 't': {
|
case 't': {
|
||||||
|
@ -457,7 +457,7 @@ static int umh_pipe_setup(struct subprocess_info *info, struct cred *new)
|
||||||
return 0;
|
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_state core_state;
|
||||||
struct core_name cn;
|
struct core_name cn;
|
||||||
|
@ -472,7 +472,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||||
bool need_nonrelative = false;
|
bool need_nonrelative = false;
|
||||||
static atomic_t core_dump_count = ATOMIC_INIT(0);
|
static atomic_t core_dump_count = ATOMIC_INIT(0);
|
||||||
struct coredump_params cprm = {
|
struct coredump_params cprm = {
|
||||||
.signr = signr,
|
.siginfo = siginfo,
|
||||||
.regs = regs,
|
.regs = regs,
|
||||||
.limit = rlimit(RLIMIT_CORE),
|
.limit = rlimit(RLIMIT_CORE),
|
||||||
/*
|
/*
|
||||||
|
@ -483,7 +483,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||||
.mm_flags = mm->flags,
|
.mm_flags = mm->flags,
|
||||||
};
|
};
|
||||||
|
|
||||||
audit_core_dumps(signr);
|
audit_core_dumps(siginfo->si_signo);
|
||||||
|
|
||||||
binfmt = mm->binfmt;
|
binfmt = mm->binfmt;
|
||||||
if (!binfmt || !binfmt->core_dump)
|
if (!binfmt || !binfmt->core_dump)
|
||||||
|
@ -507,7 +507,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||||
need_nonrelative = true;
|
need_nonrelative = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = coredump_wait(exit_code, &core_state);
|
retval = coredump_wait(siginfo->si_signo, &core_state);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto fail_creds;
|
goto fail_creds;
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ struct linux_binprm {
|
||||||
|
|
||||||
/* Function parameter for binfmt->coredump */
|
/* Function parameter for binfmt->coredump */
|
||||||
struct coredump_params {
|
struct coredump_params {
|
||||||
long signr;
|
siginfo_t *siginfo;
|
||||||
struct pt_regs *regs;
|
struct pt_regs *regs;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
unsigned long limit;
|
unsigned long limit;
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
extern int dump_write(struct file *file, const void *addr, int nr);
|
extern int dump_write(struct file *file, const void *addr, int nr);
|
||||||
extern int dump_seek(struct file *file, loff_t off);
|
extern int dump_seek(struct file *file, loff_t off);
|
||||||
#ifdef CONFIG_COREDUMP
|
#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
|
#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
|
||||||
|
|
||||||
#endif /* _LINUX_COREDUMP_H */
|
#endif /* _LINUX_COREDUMP_H */
|
||||||
|
|
|
@ -2360,7 +2360,7 @@ relock:
|
||||||
* first and our do_group_exit call below will use
|
* first and our do_group_exit call below will use
|
||||||
* that value and ignore the one we pass it.
|
* that value and ignore the one we pass it.
|
||||||
*/
|
*/
|
||||||
do_coredump(info->si_signo, info->si_signo, regs);
|
do_coredump(info, regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче