summaryrefslogtreecommitdiffstats
path: root/fs/exec.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@tglx.tec.linutronix.de>2005-07-13 10:45:00 +0200
committerThomas Gleixner <tglx@mtd.linutronix.de>2005-07-13 10:45:00 +0200
commit1b3035b7fcc72b6b36f2a3634dad832eb2453ce8 (patch)
tree728174d72943cc9b981a5843553551df62eddc41 /fs/exec.c
parenta98a5d04f400ad112e59cadd739dbabf89417e60 (diff)
parentc32511e2718618f0b53479eb36e07439aa363a74 (diff)
downloadkernel-crypto-1b3035b7fcc72b6b36f2a3634dad832eb2453ce8.tar.gz
kernel-crypto-1b3035b7fcc72b6b36f2a3634dad832eb2453ce8.tar.xz
kernel-crypto-1b3035b7fcc72b6b36f2a3634dad832eb2453ce8.zip
Merge with rsync://fileserver/linux
Diffstat (limited to 'fs/exec.c')
-rw-r--r--fs/exec.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/exec.c b/fs/exec.c
index 48871917d36..222ab1c572d 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -642,6 +642,18 @@ static inline int de_thread(struct task_struct *tsk)
count = 2;
if (thread_group_leader(current))
count = 1;
+ else {
+ /*
+ * The SIGALRM timer survives the exec, but needs to point
+ * at us as the new group leader now. We have a race with
+ * a timer firing now getting the old leader, so we need to
+ * synchronize with any firing (by calling del_timer_sync)
+ * before we can safely let the old group leader die.
+ */
+ sig->real_timer.data = (unsigned long)current;
+ if (del_timer_sync(&sig->real_timer))
+ add_timer(&sig->real_timer);
+ }
while (atomic_read(&sig->count) > count) {
sig->group_exit_task = current;
sig->notify_count = count;