On 05/15, Christian Brauner wrote:
+SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags) +{
- int fd, ret;
- struct pid *p;
- struct task_struct *tsk;
- if (flags)
return -EINVAL;
- if (pid <= 0)
return -EINVAL;
- p = find_get_pid(pid);
- if (!p)
return -ESRCH;
- rcu_read_lock();
- tsk = pid_task(p, PIDTYPE_PID);
You do not need find_get_pid() before rcu_lock and put_pid() at the end. You can just do find_vpid() under rcu_read_lock().
- if (!tsk)
ret = -ESRCH;
- else if (unlikely(!thread_group_leader(tsk)))
ret = -EINVAL;
it seems that you can do a single check
tsk = pid_task(p, PIDTYPE_TGID); if (!tsk) ret = -ESRCH;
this even looks more correct if we race with exec changing the leader.
Oleg.