From nobody Sun Jul 5 05:13:47 2026 X-Original-To: dev-commits-src-all@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 4gtFyM73nnz6jncg for ; Sun, 05 Jul 2026 05:13:47 +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 4gtFyM4Sykz3Lgp for ; Sun, 05 Jul 2026 05:13:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783228427; 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=Cgf0E2+GswWYuxtbF8UGuq3Kr1vH5rndt1Gf4exGgcc=; b=lzndOoMTG+quIKW4+vcndXO8g3wO/50mtSS+OwvHYlWkXWjMuOWzBaXu23TQzZbinWgwOn YSP8Daf2uWId6VcxVRwWzvL2gnu3xf/UPdPRou+fm+yQAQ24Ijgl6RW3TNpS1I3uaZMdHc ENk2Qo6yUBx/JqXfNNusftO9A1AnCSndqiSU10cAx2RoIF462nGDbRJ1GtfXccv7JSyin3 PMnGxiExLbgDpsdg5/DbfL8HTZo6UBmsFPVTbbejhfa1GLyMZTDoWSoPpVBHUPBoeZ09Sk 9ko/d2JP4Yug51nGz/hSx2Tepd6DvjzOwIKfTEUEO2tleBBfY2m+TbDDyimnJA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1783228427; a=rsa-sha256; cv=none; b=fEAcaB8kZ8VYkNyMUEzxxdGaTtA1V5URIT225ONYsFydQwt1sEHkxY/mPHFg5hI93bzhNv 0S+z1w73EPeRS8WYpPW90BVqnX9VyBsq4TCi9Qx4ka6LTwIsCR17yEPfRQBG1HeZmr+g+U k8ZjvtqKHou/VGWk0wgkQLZoCh8IUZfyDrqyJzqrL9p9K0Xim9oZrCZ32e0X+v5eKJ0hmd qUnf6Dm5QSZd6elmT83yEtAnxqKPCkFBxWWBTjS2GvO+RkJkuHH6dTlIPZEPipi7/n48nm d3dMAcWBawNCtZaV+qqgrH14gogx3uC6s6A+KLyn0EA6HfRlfXsLQiV6deBhBw== 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=1783228427; 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=Cgf0E2+GswWYuxtbF8UGuq3Kr1vH5rndt1Gf4exGgcc=; b=lznOSYPS9LnV/gN3fxJq5511JqOF/4Q6Rg2IVxwZwRQsHAcBU7lU9NDV1ygNN2/f6wjddJ JPF3uclsf45PO2xhAhLu/0ewPDFeKpP+mCl00XNSavziHeAthqJE6A0LgbkF6ZEJs6YOqB 4400VFMHzG+2J3DomfsVvuGjUNSYlyJ6/a1FvAFC8ZZRPZKiVoWC+Kwq2vl50aYlzUWSLQ 7G0QghuouYZYItQ7p5yryFw8/sqtc/9tvXVq+vq8SI7sgeSm3doiaj1I6ENH33EVxjCadd UQft2xDhR/u60lA0bw2Av1Uz+r5L3hA2Js0ChrrVTCp8MpmpPP0DeYDXJyrbIA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gtFyM31lTz13JY for ; Sun, 05 Jul 2026 05:13:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 22a25 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 05 Jul 2026 05:13:47 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jamie Gritton Subject: git: 530ee2980c50 - stable/14 - jail: clean up locking around do_jail_attach List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@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: jamie X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 530ee2980c50d3639e01e21a7fed64eed2741ebf Auto-Submitted: auto-generated Date: Sun, 05 Jul 2026 05:13:47 +0000 Message-Id: <6a49e80b.22a25.226d169f@gitrepo.freebsd.org> The branch stable/14 has been updated by jamie: URL: https://cgit.FreeBSD.org/src/commit/?id=530ee2980c50d3639e01e21a7fed64eed2741ebf commit 530ee2980c50d3639e01e21a7fed64eed2741ebf Author: Jamie Gritton AuthorDate: 2026-06-25 03:21:18 +0000 Commit: Jamie Gritton CommitDate: 2026-07-05 03:26:04 +0000 jail: clean up locking around do_jail_attach jail_attach_jd passed PD_DEREF to do_jail_attach, assuming it would take care of freeing the held prison. This is not true, as do_jail_attach immediately cleared that flag, leaving the jail stock in dying state when it is later removed. Reported by: markj Reviewed by: markj Differential Revision: (cherry picked from commit 3584cde63e416d150214192721cead4b735ca0b5) --- sys/kern/kern_jail.c | 57 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index a18da4472947..f40e7c4e176c 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -149,7 +149,7 @@ LIST_HEAD(, prison_racct) allprison_racct; int lastprid = 0; static int get_next_prid(struct prison **insprp); -static int do_jail_attach(struct thread *td, struct prison *pr, int drflags); +static int do_jail_attach(struct thread *td, struct prison *pr, int *drflagsp); static void prison_complete(void *context, int pending); static void prison_deref(struct prison *pr, int flags); static void prison_deref_kill(struct prison *pr, struct prisonlist *freeprison); @@ -2134,11 +2134,12 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) pr->pr_state = PRISON_STATE_ALIVE; } - /* Attach this process to the prison if requested. */ + /* + * Attach this process to the prison if requested. This will + * unlock allprison_lock, meaning changes are now user-visible. + */ if (flags & JAIL_ATTACH) { - error = do_jail_attach(td, pr, - prison_lock_xlock(pr, drflags & PD_LOCK_FLAGS)); - drflags &= ~(PD_LOCKED | PD_LIST_XLOCKED); + error = do_jail_attach(td, pr, &drflags); if (error) { vfs_opterror(opts, "attach failed"); goto done_deref; @@ -2631,39 +2632,48 @@ int sys_jail_attach(struct thread *td, struct jail_attach_args *uap) { struct prison *pr; - int error; + int drflags, error; error = priv_check(td, PRIV_JAIL_ATTACH); if (error) return (error); sx_slock(&allprison_lock); + drflags = PD_LIST_SLOCKED; pr = prison_find_child(td->td_ucred->cr_prison, uap->jid); if (pr == NULL) { - sx_sunlock(&allprison_lock); - return (EINVAL); + error = EINVAL; + goto done; } + drflags |= PD_LOCKED; /* Do not allow a process to attach to a prison that is not alive. */ if (!prison_isalive(pr)) { - mtx_unlock(&pr->pr_mtx); - sx_sunlock(&allprison_lock); - return (EINVAL); + error = EINVAL; + goto done; } - return (do_jail_attach(td, pr, PD_LOCKED | PD_LIST_SLOCKED)); + error = do_jail_attach(td, pr, &drflags); + + done: + prison_deref(pr, drflags); + return (error); } +/* + * Attach the current process to a prison. On entry, the allprison + * lock should be at least shared. On exit, both it and the prison + * itself will be unlocked, which will be refelected in *drflagsp. + */ static int -do_jail_attach(struct thread *td, struct prison *pr, int drflags) +do_jail_attach(struct thread *td, struct prison *pr, int *drflagsp) { struct proc *p; struct ucred *newcred, *oldcred; - int error; + int drflags, error; - mtx_assert(&pr->pr_mtx, MA_OWNED); sx_assert(&allprison_lock, SX_LOCKED); - drflags &= PD_LOCK_FLAGS; + KASSERT(prison_isvalid(pr), ("Attaching to invalid prison %p", pr)); /* * XXX: Note that there is a slight race here if two threads * in the same privileged process attempt to attach to two @@ -2672,13 +2682,22 @@ do_jail_attach(struct thread *td, struct prison *pr, int drflags) * a process root from one prison, but attached to the jail * of another. */ + + /* + * Note the caller's locking state, but gain and track our own + * references. The caller will see that locks have been + * dropped (which isn't true now, but will be after OSD calls). + */ prison_hold(pr); refcount_acquire(&pr->pr_uref); - drflags |= PD_DEREF | PD_DEUREF; - mtx_unlock(&pr->pr_mtx); - drflags &= ~PD_LOCKED; + drflags = PD_DEREF | PD_DEUREF | (*drflagsp & PD_LOCK_FLAGS); + *drflagsp &= PD_OP_FLAGS; /* Let modules do whatever they need to prepare for attaching. */ + if (drflags & PD_LOCKED) { + mtx_unlock(&pr->pr_mtx); + drflags &= ~PD_LOCKED; + } error = osd_jail_call(pr, PR_METHOD_ATTACH, td); if (error) goto e_revert_osd;