Re: [PATCH] procfs: fix missing RCU protection when reading real_parent in do_task_stat()
From: Mateusz Guzik
Date: Tue Jan 27 2026 - 13:59:49 EST
On Tue, Jan 27, 2026 at 06:25:25PM +0100, Oleg Nesterov wrote:
> On 01/27, alexjlzheng@xxxxxxxxx wrote:
> > --- a/fs/proc/array.c
> > +++ b/fs/proc/array.c
> > @@ -528,7 +528,9 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
> > }
> >
> > sid = task_session_nr_ns(task, ns);
> > - ppid = task_tgid_nr_ns(task->real_parent, ns);
> > + rcu_read_lock();
> > + ppid = task_tgid_nr_ns(rcu_dereference(task->real_parent), ns);
> > + rcu_read_unlock();
>
> But this can't really help. If task->real_parent has already exited and
> it was reaped, then it is actually "Too late!" for rcu_read_lock().
>
> Please use task_ppid_nr_ns() which does the necessary pid_alive() check.
>
That routine looks bogus in its own right though.
Suppose it fits the time window between the current parent exiting and
the task being reassigned to init. Then you transiently see 0 as the pid,
instead of 1 (or whatever). This reads like a bug to me.
But suppose task_ppid_nr_ns() managed to get the right value at the
time. As per usual, such an exit + reaping could have happened before
the caller even looks at the returned pid.
Or to put it differently, imo the check in the routine not only does not
help, but introduces a corner case with a bogus result.
It probably should do precisely the same thing proposed in this patch,
as in:
rcu_read_lock();
ppid = task_tgid_nr_ns(rcu_dereference(task->real_parent), ns);
rcu_read_unlock();