Fixes an exit()/posix_cpu_clock_get() race spotted by Oleg Nesterov.
Solution is to move the p->signal check under the tasklist_lock.

Signed-off-by: Paul E. McKenney <[EMAIL PROTECTED]>
---

 posix-cpu-timers.c |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff -urpNa -X dontdiff linux-2.6.20-rc6-clockrcu/kernel/posix-cpu-timers.c 
linux-2.6.20-rc6-clockrcu-fixes/kernel/posix-cpu-timers.c
--- linux-2.6.20-rc6-clockrcu/kernel/posix-cpu-timers.c 2007-02-01 
13:03:57.000000000 -0800
+++ linux-2.6.20-rc6-clockrcu-fixes/kernel/posix-cpu-timers.c   2007-02-03 
16:53:41.000000000 -0800
@@ -312,10 +312,13 @@ int posix_cpu_clock_get(const clockid_t 
                                        error = cpu_clock_sample(which_clock,
                                                                 p, &rtn);
                                }
-                       } else if (p->tgid == pid && p->signal) {
+                       } else {
                                read_lock(&tasklist_lock);
-                               error = cpu_clock_sample_group(which_clock,
-                                                              p, &rtn);
+                               if (p->tgid == pid && p->signal) {
+                                       error =
+                                           cpu_clock_sample_group(which_clock,
+                                                                  p, &rtn);
+                               }
                                read_unlock(&tasklist_lock);
                        }
                }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to