From nobody Sun Aug 16 02:46:22 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 4hN0ht4QXfz6pGs9 for ; Sun, 16 Aug 2026 02:46:22 +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 4hN0ht3kRyz3dHF for ; Sun, 16 Aug 2026 02:46:22 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786848382; 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=W+DoXOtnBrDHQFfkq6TqM2El0WPcev43Yf3kK8czSdg=; b=Ah/takVl0jLQwTMlMGE/YWr0T25i1CdxnZiFRndKM+3wm0qDq29FLsrnfiU6DeqkWHw7xf e8+DVXEqWE8PqxJtJQYYMgi+Q61iBpHfWykvbsTPuK4TDxUpZhUXpURl4qYVpyOQU8MFCm hEr0VpRwELsNyRccHSBBARFfmaEmcT7Dwt4gO3bfOJNHI9/fHp41p7An7v3sJtHyyNf+Hn FCYnYMLUFjFqjPcOrY9snHNCK9qd/8OW7gpUAK94RT9fGFpfq9hopMklEi9pYEWHQGj6tZ zZl8ShoSLH8xXeAlFVXT7mqGHDPtGdaNPcwsnsEcsjkEGaIwFNKg9T7YL2Vk0w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786848382; a=rsa-sha256; cv=none; b=XYu4tiJpQVF2Y24rlAm1EKiHlH5ndhzzBBHiluQgjjTaoltAXW6L8CuSRU1OEPhYGGLmNc H5Fm8JrK+n4iJNfXW41VM5R9Ny7bz9d7UOPONdOzrgS00p9dtvN+u6CMpGY1WtFEHXFwDB m6RXr9uietydyb2tcC8ZX+sDShc3mSA8B7gIWPwVXg09eB4D+RhrVxKoFk1U8L2o7TR9iM gXoiuu/y44kOC4VcDOcQH8gxnbZ3PL7KNIAbt3Ta1R57JQhsPpTxl8fg4uyV4YxtN8YVnW 6WxuwRNwFw92Ocm3PVYkfljcXHHhJAwxx0Vjk5KCnB13pQ+pFgRx/V5ebxopDQ== 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=1786848382; 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=W+DoXOtnBrDHQFfkq6TqM2El0WPcev43Yf3kK8czSdg=; b=wHK4mVIWf1lB9EjU9rYfQGBt5TthqmruEXu3sSj5vG7WpVph7wsHgKnk8bYUfCL40bz//Z DQnNJMjyWco74Z+YLpJxHp54jcyC06+OQEXdxB1w/CM8bK9JY3uvvEfD2IBpKwjR7U+MOV ojGU+6F8VJdg2K86wVHWCXs/weP7MLbCfJEDKCjNEiMV9Ir5m6YsxsVWzn53q9goUAj+z4 z2MAEzRJ6YzPDJO6cPf7tHIFOE5PAkyvvsNJ/ewXQyJ+roU/W7pjCGooNZ3/0dLOyam6e1 Ct5y3cn+pXv1580qq4wPizBXYuFY0Zj9j0k6AyYMcahXiU7k9LiytmMKg74Hog== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hN0ht2V9Lz173F for ; Sun, 16 Aug 2026 02:46:22 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 44adb by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 16 Aug 2026 02:46:22 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 2520c8bd2c42 - stable/15 - tty: do not recurse on ttydev_close() 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: 2520c8bd2c42f4333bc1f4b94a78efa625bc97c9 Auto-Submitted: auto-generated Date: Sun, 16 Aug 2026 02:46:22 +0000 Message-Id: <6a81247e.44adb.45c99ea3@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=2520c8bd2c42f4333bc1f4b94a78efa625bc97c9 commit 2520c8bd2c42f4333bc1f4b94a78efa625bc97c9 Author: Konstantin Belousov AuthorDate: 2026-08-07 19:48:31 +0000 Commit: Konstantin Belousov CommitDate: 2026-08-16 02:41:17 +0000 tty: do not recurse on ttydev_close() (cherry picked from commit e2cfbd498af88a211b0b347861cfd989e57cd1fb) --- sys/kern/tty.c | 30 +++++++++++++++++++++--------- sys/sys/tty.h | 1 + 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 5f6afa49b70d..09ed1c6d0c5d 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -71,7 +71,7 @@ static MALLOC_DEFINE(M_TTY, "tty", "tty device"); -static void tty_rel_free(struct tty *tp); +static void tty_rel_free(struct tty *tp, bool inttydevclose); static TAILQ_HEAD(, tty) tty_list = TAILQ_HEAD_INITIALIZER(tty_list); static struct sx tty_list_sx; @@ -229,13 +229,15 @@ ttydev_enter(struct tty *tp) } static void -ttydev_leave(struct tty *tp) +ttydev_leave(struct tty *tp, bool inttydevclose) { tty_assert_locked(tp); if (tty_opened(tp) || tp->t_flags & TF_OPENCLOSE) { /* Device is still opened somewhere. */ + if (inttydevclose) + tp->t_flags &= ~TF_INDEVCLOSE; tty_unlock(tp); return; } @@ -262,7 +264,7 @@ ttydev_leave(struct tty *tp) tp->t_flags &= ~TF_OPENCLOSE; cv_broadcast(&tp->t_dcdwait); - tty_rel_free(tp); + tty_rel_free(tp, inttydevclose); } /* @@ -363,7 +365,7 @@ ttydev_open(struct cdev *dev, int oflags, int devtype __unused, done: tp->t_flags &= ~TF_OPENCLOSE; cv_broadcast(&tp->t_dcdwait); - ttydev_leave(tp); + ttydev_leave(tp, false); return (error); } @@ -375,6 +377,11 @@ ttydev_close(struct cdev *dev, int fflag, int devtype __unused, struct tty *tp = dev->si_drv1; tty_lock(tp); + if ((tp->t_flags & TF_INDEVCLOSE) != 0) { + tty_unlock(tp); + return (0); + } + tp->t_flags |= TF_INDEVCLOSE; /* * Don't actually close the device if it is being used as the @@ -388,6 +395,7 @@ ttydev_close(struct cdev *dev, int fflag, int devtype __unused, tp->t_flags &= ~(TF_OPENED_IN|TF_OPENED_OUT); if (tp->t_flags & TF_OPENED) { + tp->t_flags &= ~TF_INDEVCLOSE; tty_unlock(tp); return (0); } @@ -407,7 +415,7 @@ ttydev_close(struct cdev *dev, int fflag, int devtype __unused, cv_broadcast(&tp->t_bgwait); cv_broadcast(&tp->t_dcdwait); - ttydev_leave(tp); + ttydev_leave(tp, true); return (0); } @@ -1144,7 +1152,7 @@ tty_dealloc(void *arg) } static void -tty_rel_free(struct tty *tp) +tty_rel_free(struct tty *tp, bool inttydevclose) { struct cdev *dev; @@ -1153,6 +1161,8 @@ tty_rel_free(struct tty *tp) #define TF_ACTIVITY (TF_GONE|TF_OPENED|TF_HOOK|TF_OPENCLOSE) if (tp->t_sessioncnt != 0 || (tp->t_flags & TF_ACTIVITY) != TF_GONE) { /* TTY is still in use. */ + if (inttydevclose) + tp->t_flags &= ~TF_INDEVCLOSE; tty_unlock(tp); return; } @@ -1163,6 +1173,8 @@ tty_rel_free(struct tty *tp) /* TTY can be deallocated. */ dev = tp->t_dev; tp->t_dev = NULL; + if (inttydevclose) + tp->t_flags &= ~TF_INDEVCLOSE; tty_unlock(tp); if (dev != NULL) { @@ -1199,7 +1211,7 @@ tty_rel_sess(struct tty *tp, struct session *sess) MPASS(tp->t_pgrp == NULL); } tp->t_sessioncnt--; - tty_rel_free(tp); + tty_rel_free(tp, false); } void @@ -1218,7 +1230,7 @@ tty_rel_gone(struct tty *tp) cv_broadcast(&tp->t_dcdwait); tp->t_flags |= TF_GONE; - tty_rel_free(tp); + tty_rel_free(tp, false); } static int @@ -2226,7 +2238,7 @@ ttyhook_unregister(struct tty *tp) ttydisc_optimize(tp); /* Maybe deallocate the TTY as well. */ - tty_rel_free(tp); + tty_rel_free(tp, false); } /* diff --git a/sys/sys/tty.h b/sys/sys/tty.h index f1b2646c942d..6a58908d97a4 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -87,6 +87,7 @@ struct tty { #define TF_BUSY_IN 0x20000 /* Process busy in read() -- not supported. */ #define TF_BUSY_OUT 0x40000 /* Process busy in write(). */ #define TF_BUSY (TF_BUSY_IN|TF_BUSY_OUT) +#define TF_INDEVCLOSE 0x80000 /* In ttydev_close() */ unsigned int t_revokecnt; /* (t) revoke() count. */ /* Buffering mechanisms. */