From nobody Sun Aug 16 02:46:36 2026 X-Original-To: dev-commits-src-branches@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 4hN0j92PfYz6pH5y for ; Sun, 16 Aug 2026 02:46:37 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hN0j868d6z3dxB for ; Sun, 16 Aug 2026 02:46:36 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786848396; 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=fWfg+BcRCmfTuEv+oESCx0Sy7B1jGKdBY2uucK3OjjQ=; b=BOyUMVe0vsqIoeeQLLogptJqLEFXQSlp0l57W8lhftID6sTQyu4hHk9Pw/bxKVISJtFdP8 mbRW4x+4f0MskZae6N5/oflm6B1uxica2AfzqAhTwdNZMjhQO/EkbRvWWAIWvUn+cajeUC wPw3IITxnTGxkmIGtfHaz6h4ncYyzepp3hx5Xd1Aw8akjWw9P46BMPq1QgohYld8Z6fHXN weZ+ue+9md9TYGj15R+S8v+8QlD29ybdkPhva1nXU9r+vkvy+kYXxN7Zhhs09T8B66izob ZQuEYkO87z7mz8MTAW8QNoVISgCpsvG1kgTG77PNu3R6thN9/rK4x0qYY2b4IA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786848396; a=rsa-sha256; cv=none; b=irkV54VOzEi8skJhPmaE4arrC2j6d1wvwWJz9BOIVtjROb/VmpxALCgnpZi4ijYeGLm66A rFfmllHf3ggyvZB7oUig3LssnxpkJC8jTkaL55lx5uH4OvBMJSb1AjZHIKvgojavwwVP+k yU8rHtKj6emxUsuXlKUNmRO62bkmwe9mi1VHhWDlwvrc7sId0bY02DV88yKgE95WHeSJjB wWF/V2cUh5Sp8Zz+nO/sYAVbFQi32nzzE8N5hS/t8Q/r5T4oM9Jrrs28SXlSosmKa/VYSh Fvwf2nG9beB0aphUwfliG9IehLgfxrMW6O7+RgszW9Qsjl96hvWLldsG06wJGQ== 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=1786848396; 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=fWfg+BcRCmfTuEv+oESCx0Sy7B1jGKdBY2uucK3OjjQ=; b=TDe+XQT2Ov9Er4695pPKjMMxXWEpI+MOjeXTu49uox9nYeuYCfIGnEijOBH1Sajk79jbQL 9lc19XC+o8ARSC68fkF+bhdgxXF++vCOgqlBb9gPE5hav6XW+cyarKMcsZoNr3TTrRKgQB MyrtbBtY30qshmoBraHh+GNycNZlgFh0SmrrZ/EsNd+mJsOjW5EfD5LLKIf2gTHSRgxEpT QUMVM0NPaZy/Tzz/HuP+XuceUEPtURO4NGCpk/ONVVxm6RjqNri58fV/iWfwDt5twN9Eb7 0ObH/ipr0tbr/bm4BfjoSczVzQxQSBzd5g6wui+YeXcTlevwhm+LMdlmDXHypw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hN0j859Jpz18Dy for ; Sun, 16 Aug 2026 02:46:36 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 447b3 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 16 Aug 2026 02:46:36 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 43c9d80a4443 - stable/15 - kern: add pdopenpid(2) List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/stable/15 X-Git-Reftype: branch X-Git-Commit: 43c9d80a4443c2497d663d0b050375253e39e966 Auto-Submitted: auto-generated Date: Sun, 16 Aug 2026 02:46:36 +0000 Message-Id: <6a81248c.447b3.6057fec7@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=43c9d80a4443c2497d663d0b050375253e39e966 commit 43c9d80a4443c2497d663d0b050375253e39e966 Author: Konstantin Belousov AuthorDate: 2026-05-20 02:04:02 +0000 Commit: Konstantin Belousov CommitDate: 2026-08-16 02:41:21 +0000 kern: add pdopenpid(2) (cherry picked from commit 5c32aa785184bb1e646b0b4c73d3c5fd9a6b8951) --- 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 c4df1f30989b..ec9d3ee9aa37 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 { @@ -612,3 +616,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 4c7de9d59ded..bc81f22d3cb4 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -3422,4 +3422,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.