bsd_acct: plain current->real_parent access is not always safe
authorPavel Emelyanov <xemul@openvz.org>
Mon, 24 Mar 2008 19:29:52 +0000 (12:29 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 25 Mar 2008 02:22:19 +0000 (19:22 -0700)
This is minor, but dereferencing even current real_parent is not safe on debug
kernels, since the memory, this points to, can be unmapped - RCU protection is
required.

Besides, the tgid field is deprecated and is to be replaced with task_tgid_xxx
call (the 2nd patch), so RCU will be required anyway.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
kernel/acct.c

index 521dfa53cb999657ce8971494f1f573d88d55df7..7ff5339a3f058d50f3bbbdffcae8c8a38145ec19 100644 (file)
@@ -482,7 +482,9 @@ static void do_acct_process(struct file *file)
 #endif
 #if ACCT_VERSION==3
        ac.ac_pid = current->tgid;
 #endif
 #if ACCT_VERSION==3
        ac.ac_pid = current->tgid;
-       ac.ac_ppid = current->real_parent->tgid;
+       rcu_read_lock();
+       ac.ac_ppid = rcu_dereference(current->real_parent)->tgid;
+       rcu_read_unlock();
 #endif
 
        spin_lock_irq(&current->sighand->siglock);
 #endif
 
        spin_lock_irq(&current->sighand->siglock);