The patch titled

     reset real_timer target on exec leader change

has been added to the -mm tree.  Its filename is

     reset-real_timer-target-on-exec-leader-change.patch

Patches currently in -mm which might be from [EMAIL PROTECTED] are

x86-64-ptrace-ia32-bp-fix.patch
reset-real_timer-target-on-exec-leader-change.patch
kgdb-ga.patch



From: Roland McGrath <[EMAIL PROTECTED]>

When a noninitial thread does exec, it becomes the new group leader.  If
there is a ITIMER_REAL timer running, it points at the old group leader and
when it fires it can follow a stale pointer.  The timer data needs to be
reset to point at the exec'ing thread that is becoming the group leader. 
This has to synchronize with any concurrent firing of the timer to make
sure that it_real_fn can never run when the data points to a thread that
might have been reaped already.

Signed-off-by: Roland McGrath <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 fs/exec.c |   13 +++++++++++++
 1 files changed, 13 insertions(+)

diff -puN fs/exec.c~reset-real_timer-target-on-exec-leader-change fs/exec.c
--- devel/fs/exec.c~reset-real_timer-target-on-exec-leader-change       
2005-07-07 02:15:05.000000000 -0700
+++ devel-akpm/fs/exec.c        2005-07-07 02:15:05.000000000 -0700
@@ -642,6 +642,19 @@ static inline int de_thread(struct task_
        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;
_
-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to