mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-08 14:13:53 +00:00
proc: Use PIDTYPE_TGID in next_tgid
Combine the pid_task and thes test has_group_leader_pid into a single dereference by using pid_task(PIDTYPE_TGID). This makes the code simpler and proof against needing to even think about any shenanigans that de_thread might get up to. Acked-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
parent
0fb5ce62c5
commit
3147d8aaa0
@ -3359,20 +3359,8 @@ static struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter ite
|
||||
pid = find_ge_pid(iter.tgid, ns);
|
||||
if (pid) {
|
||||
iter.tgid = pid_nr_ns(pid, ns);
|
||||
iter.task = pid_task(pid, PIDTYPE_PID);
|
||||
/* What we to know is if the pid we have find is the
|
||||
* pid of a thread_group_leader. Testing for task
|
||||
* being a thread_group_leader is the obvious thing
|
||||
* todo but there is a window when it fails, due to
|
||||
* the pid transfer logic in de_thread.
|
||||
*
|
||||
* So we perform the straight forward test of seeing
|
||||
* if the pid we have found is the pid of a thread
|
||||
* group leader, and don't worry if the task we have
|
||||
* found doesn't happen to be a thread group leader.
|
||||
* As we don't care in the case of readdir.
|
||||
*/
|
||||
if (!iter.task || !has_group_leader_pid(iter.task)) {
|
||||
iter.task = pid_task(pid, PIDTYPE_TGID);
|
||||
if (!iter.task) {
|
||||
iter.tgid += 1;
|
||||
goto retry;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user