diff options
-rw-r--r-- | fs/exec.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -1460,11 +1460,21 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs) | |||
1460 | current->fsuid = 0; /* Dump root private */ | 1460 | current->fsuid = 0; /* Dump root private */ |
1461 | } | 1461 | } |
1462 | mm->dumpable = 0; | 1462 | mm->dumpable = 0; |
1463 | init_completion(&mm->core_done); | 1463 | |
1464 | retval = -EAGAIN; | ||
1464 | spin_lock_irq(¤t->sighand->siglock); | 1465 | spin_lock_irq(¤t->sighand->siglock); |
1465 | current->signal->flags = SIGNAL_GROUP_EXIT; | 1466 | if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) { |
1466 | current->signal->group_exit_code = exit_code; | 1467 | current->signal->flags = SIGNAL_GROUP_EXIT; |
1468 | current->signal->group_exit_code = exit_code; | ||
1469 | retval = 0; | ||
1470 | } | ||
1467 | spin_unlock_irq(¤t->sighand->siglock); | 1471 | spin_unlock_irq(¤t->sighand->siglock); |
1472 | if (retval) { | ||
1473 | up_write(&mm->mmap_sem); | ||
1474 | goto fail; | ||
1475 | } | ||
1476 | |||
1477 | init_completion(&mm->core_done); | ||
1468 | coredump_wait(mm); | 1478 | coredump_wait(mm); |
1469 | 1479 | ||
1470 | /* | 1480 | /* |