|
@@ -390,12 +390,14 @@ static int coredump_wait(int exit_code, struct core_state *core_state)
|
|
|
return core_waiters;
|
|
|
}
|
|
|
|
|
|
-static void coredump_finish(struct mm_struct *mm)
|
|
|
+static void coredump_finish(struct mm_struct *mm, bool core_dumped)
|
|
|
{
|
|
|
struct core_thread *curr, *next;
|
|
|
struct task_struct *task;
|
|
|
|
|
|
spin_lock_irq(¤t->sighand->siglock);
|
|
|
+ if (core_dumped && !__fatal_signal_pending(current))
|
|
|
+ current->signal->group_exit_code |= 0x80;
|
|
|
current->signal->group_exit_task = NULL;
|
|
|
current->signal->flags = SIGNAL_GROUP_EXIT;
|
|
|
spin_unlock_irq(¤t->sighand->siglock);
|
|
@@ -480,6 +482,7 @@ void do_coredump(siginfo_t *siginfo)
|
|
|
int ispipe;
|
|
|
struct files_struct *displaced;
|
|
|
bool need_nonrelative = false;
|
|
|
+ bool core_dumped = false;
|
|
|
static atomic_t core_dump_count = ATOMIC_INIT(0);
|
|
|
struct coredump_params cprm = {
|
|
|
.siginfo = siginfo,
|
|
@@ -638,9 +641,7 @@ void do_coredump(siginfo_t *siginfo)
|
|
|
goto close_fail;
|
|
|
if (displaced)
|
|
|
put_files_struct(displaced);
|
|
|
- retval = binfmt->core_dump(&cprm);
|
|
|
- if (retval)
|
|
|
- current->signal->group_exit_code |= 0x80;
|
|
|
+ core_dumped = binfmt->core_dump(&cprm);
|
|
|
|
|
|
if (ispipe && core_pipe_limit)
|
|
|
wait_for_dump_helpers(cprm.file);
|
|
@@ -653,7 +654,7 @@ fail_dropcount:
|
|
|
fail_unlock:
|
|
|
kfree(cn.corename);
|
|
|
fail_corename:
|
|
|
- coredump_finish(mm);
|
|
|
+ coredump_finish(mm, core_dumped);
|
|
|
revert_creds(old_cred);
|
|
|
fail_creds:
|
|
|
put_cred(cred);
|