bsd_acct: plain current->real_parent access is not always safe
[sfrench/cifs-2.6.git] / kernel / acct.c
index fce53d8df8a7ade114a002885a8cbfc1cdbedc49..7ff5339a3f058d50f3bbbdffcae8c8a38145ec19 100644 (file)
@@ -413,7 +413,7 @@ static u32 encode_float(u64 value)
  *  The acct_process() call is the workhorse of the process
  *  accounting system. The struct acct is built here and then written
  *  into the accounting file. This function should only be called from
- *  do_exit().
+ *  do_exit() or when switching to a different output file.
  */
 
 /*
@@ -482,7 +482,9 @@ static void do_acct_process(struct file *file)
 #endif
 #if ACCT_VERSION==3
        ac.ac_pid = current->tgid;
-       ac.ac_ppid = current->parent->tgid;
+       rcu_read_lock();
+       ac.ac_ppid = rcu_dereference(current->real_parent)->tgid;
+       rcu_read_unlock();
 #endif
 
        spin_lock_irq(&current->sighand->siglock);