Commit 83b290c9 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Christian Brauner
Browse files

pidfd: clone: allow CLONE_THREAD | CLONE_PIDFD together



copy_process() just needs to pass PIDFD_THREAD to __pidfd_prepare()
if clone_flags & CLONE_THREAD.

We can also add another CLONE_ flag (or perhaps reuse CLONE_DETACHED)
to enforce PIDFD_THREAD without CLONE_THREAD.

Originally-from: Tycho Andersen <tycho@tycho.pizza>
Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Link: https://lore.kernel.org/r/20240205145532.GA28823@redhat.com


Reviewed-by: default avatarTycho Andersen <tandersen@netflix.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent e2e8a142
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -2311,9 +2311,8 @@ __latent_entropy struct task_struct *copy_process(
		/*
		 * - CLONE_DETACHED is blocked so that we can potentially
		 *   reuse it later for CLONE_PIDFD.
		 * - CLONE_THREAD is blocked until someone really needs it.
		 */
		if (clone_flags & (CLONE_DETACHED | CLONE_THREAD))
		if (clone_flags & CLONE_DETACHED)
			return ERR_PTR(-EINVAL);
	}

@@ -2536,8 +2535,10 @@ __latent_entropy struct task_struct *copy_process(
	 * if the fd table isn't shared).
	 */
	if (clone_flags & CLONE_PIDFD) {
		int flags = (clone_flags & CLONE_THREAD) ? PIDFD_THREAD : 0;

		/* Note that no task has been attached to @pid yet. */
		retval = __pidfd_prepare(pid, 0, &pidfile);
		retval = __pidfd_prepare(pid, flags, &pidfile);
		if (retval < 0)
			goto bad_fork_free_pid;
		pidfd = retval;