proc: Use PIDTYPE_TGID in next_tgid
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 25 Feb 2020 00:53:09 +0000 (18:53 -0600)
committerEric W. Biederman <ebiederm@xmission.com>
Fri, 24 Apr 2020 22:16:35 +0000 (17:16 -0500)
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>
fs/proc/base.c

index aa7b39a114c9292f49ab89b9925618736b4fbe99..5a307b3bb2d19a1350a07476f9ed086ab24e877a 100644 (file)
@@ -3359,20 +3359,8 @@ retry:
        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;
                }