From nobody Tue Jul 7 01:57:17 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gvPVj5JYMz6kd5n for ; Tue, 07 Jul 2026 01:57:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gvPVj3BT1z3V9x for ; Tue, 07 Jul 2026 01:57:17 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783389437; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=kCsb84sCSNzhKxKPxLiFmKTA/xzBqTF3G6s8sTXxUfc=; b=f0BvjZdwO9bW+bc8PLKtRQG06zuw+BPswUZ79PfqkGpNJZ+Ndn8MdtvbK41C2zxtuuz7bs ssk+fM4wp1T1yZwdZ18hz5V9phA7ErekE6XJ1uaF+rzk/PgRuc3bR/m3nh2cJBO97zCmBb 7aFmJRuyF3HCBHVr+aurPi/1TK9IBOwucX5KwHgzOdFGbf1A4ZaqR34oeSHjkFkgH5S6Fl pKUajBEquN6ECHmeWoghobgkQtYY1P42+6fTNz2ISIiqlrrr9R2Il0sEvH+Uw27sgKnTLs 2WX429WN92oBlyUAqXXiHgeE0+dqGnitfyAA+uhiyROaencp/efd5OOWbWebhA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1783389437; a=rsa-sha256; cv=none; b=u+TY9nTF7A/C+Tu2mj4I7mHVrEdt5VDDWAiFRnel82K/zJ7LoRra6/IneGkAuxgj8y+9MZ bhR1bFpULuY0aIIN6ZEUvOoh3zPGgTt7Zw3uu/9NtP9jisoYEJrPoP9ig1jZMX8QwBHWAp XSOPQCmncwy0HDsaopMcy9IJ4VIZwxc5Bh9jlB9xpB8ERf/4yGD1Hp7I/Azudp4TENDxkY S+AacnsN1Acj89+Buwgq1w3q5GQ6CtCq4ciNzppMa6c58aFsSa7IJw0h+hsdb7DrN+ZOsq Nw3KuutKO09a4s4fAg3S4XoFCxeFEdjQ09c3h0kd4HZYH3RgZyfix2xIwLLwtg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783389437; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=kCsb84sCSNzhKxKPxLiFmKTA/xzBqTF3G6s8sTXxUfc=; b=KK9T00Q+Kl3meeY0/OZwWKyaIjkCNXks/tCdGJuhvZGOmiXTHxhm9H6a7TTnDNOg4P9jQE S+6GHVlXgQ+dS4Rpz8+38Ij0T8Y0aUsf5VSrpxKgZmZgvWap3E/SRyRl2CusgJKE7ApEtE JjoDLBxjm6mFnL6K/iIENVcD5EjJPBl+sL0XZToF6qB749wrJ3vNX4qwdhUDQ3GZTqBsYY hHM4B5WQ6Q78ON88nBCnO2TMkVhe8IMl+27Yk+evzAyI0lRFEaI5PcgeK55udS2jL1HvRU Md2m1cz8nwjUqTrRVUEUMvgomMwskp63Xr6d517m9BAz/IugPrD5GULRczMhjw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gvPVj2F7pzRD for ; Tue, 07 Jul 2026 01:57:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 401a7 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 07 Jul 2026 01:57:17 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 5c32aa785184 - main - kern: add pdopenpid(2) List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5c32aa785184bb1e646b0b4c73d3c5fd9a6b8951 Auto-Submitted: auto-generated Date: Tue, 07 Jul 2026 01:57:17 +0000 Message-Id: <6a4c5cfd.401a7.4610660e@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=5c32aa785184bb1e646b0b4c73d3c5fd9a6b8951 commit 5c32aa785184bb1e646b0b4c73d3c5fd9a6b8951 Author: Konstantin Belousov AuthorDate: 2026-05-20 02:04:02 +0000 Commit: Konstantin Belousov CommitDate: 2026-07-07 01:24:51 +0000 kern: add pdopenpid(2) Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57124 --- sys/kern/sys_procdesc.c | 114 ++++++++++++++++++++++++++++++++++++++++++----- sys/kern/syscalls.master | 7 +++ sys/sys/procdesc.h | 2 + 3 files changed, 111 insertions(+), 12 deletions(-) diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c index 0d57a8cc7b2c..3fca3ea29b18 100644 --- a/sys/kern/sys_procdesc.c +++ b/sys/kern/sys_procdesc.c @@ -435,18 +435,22 @@ procdesc_close(struct file *fp, struct thread *td) pd->pd_pid = -1; procdesc_free(pd); - /* - * Next, reparent it to its reaper (usually init(8)) so - * that there's someone to pick up the pieces; finally, - * terminate with prejudice. - */ - p->p_sigparent = SIGCHLD; - if ((p->p_flag & P_TRACED) == 0) { - proc_reparent(p, p->p_reaper, true); - } else { - proc_clear_orphan(p); - p->p_oppid = p->p_reaper->p_pid; - proc_add_orphan(p, p->p_reaper); + /* Failed finstall() should not cause reaping. */ + if ((fp->f_pdflags & F_PD_NOFINSTALL) == 0) { + /* + * Next, reparent it to its reaper + * (usually init(8)) so that there's + * someone to pick up the pieces; + * finally, terminate with prejudice. + */ + p->p_sigparent = SIGCHLD; + if ((p->p_flag & P_TRACED) == 0) { + proc_reparent(p, p->p_reaper, true); + } else { + proc_clear_orphan(p); + p->p_oppid = p->p_reaper->p_pid; + proc_add_orphan(p, p->p_reaper); + } } procdesc_close_tail(fp, p); } else { @@ -609,3 +613,89 @@ procdesc_cmp(struct file *fp1, struct file *fp2, struct thread *td) pdp2 = fp2->f_data; return (kcmp_cmp((uintptr_t)pdp1->pd_pid, (uintptr_t)pdp2->pd_pid)); } + +static int +pdopenpid1(struct thread *td, pid_t pid, struct procdesc **pdf, struct file *fp) +{ + struct proc *p; + struct procdesc *pd; + int error; + + sx_assert(&proctree_lock, SX_XLOCKED); + + error = pget(pid, PGET_NOTID | PGET_CANDEBUG, &p); + if (error != 0) + return (error); + if ((p->p_flag & (P_SYSTEM | P_WEXIT)) != 0) { + PROC_UNLOCK(p); + return (EBUSY); + } + pd = p->p_procdesc; + if (pd != NULL) { + refcount_acquire(&pd->pd_refcount); + PROCDESC_LOCK(pd); + MPASS(pd->pd_fpcount > 0); + pd->pd_fpcount++; + PROCDESC_UNLOCK(pd); + } else { + pd = *pdf; + *pdf = NULL; + pd->pd_proc = p; + pd->pd_pid = p->p_pid; + p->p_procdesc = pd; + } + procdesc_finit(pd, fp); + PROC_UNLOCK(p); + return (0); +} + +static int +kern_pdopenpid(struct thread *td, pid_t pid, int flags) +{ + struct file *fp; + struct procdesc *pdf; + int error, fd, fflags; + + error = falloc_noinstall(td, &fp); + if (error != 0) + return (error); + fflags = pdtofdflags(flags); + pdf = procdesc_alloc(flags); + if ((flags & PD_DAEMON) != 0) + fp->f_pdflags |= F_PD_NOKILL; + + sx_xlock(&proctree_lock); + error = pdopenpid1(td, pid, &pdf, fp); + sx_xunlock(&proctree_lock); + + if (error == 0) { + error = finstall(td, fp, &fd, fflags, NULL); + if (error == 0) { + td->td_retval[0] = fd; + } else { + /* + * Not killing the target process if cannot + * return file descriptor to userspace. + */ + fp->f_pdflags |= F_PD_NOKILL | F_PD_NOFINSTALL; + } + } + fdrop(fp, td); + + if (pdf != NULL) { + MPASS(pdf->pd_refcount == 2); + MPASS(pdf->pd_fpcount == 1); + MPASS(pdf->pd_proc == NULL); + MPASS(pdf->pd_pid == -1); + procdesc_destroy(pdf); + } + return (error); +} + +int +sys_pdopenpid(struct thread *td, struct pdopenpid_args *args) +{ + if ((args->flags & ~(PD_ALLOWED_AT_FORK)) != 0) + return (EINVAL); + return (kern_pdopenpid(td, args->pid, args->flags)); +} diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 1032f6cd1bf0..41580d0c4595 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -3429,4 +3429,11 @@ int flags ); } +603 AUE_NULL STD { + int pdopenpid( + pid_t pid, + int flags + ); + } + ; vim: syntax=off diff --git a/sys/sys/procdesc.h b/sys/sys/procdesc.h index 5fbd43f1ac84..9eb64525e430 100644 --- a/sys/sys/procdesc.h +++ b/sys/sys/procdesc.h @@ -95,6 +95,8 @@ struct procdesc { */ #define F_PD_NOKILL 0x00000001 /* Opened with PD_DAEMON. Don't send SIGKILL when file closes. */ +#define F_PD_NOFINSTALL 0x00000002 /* Procdesc file is closing because + finstall() failed */ /* * In-kernel interfaces to process descriptors.