git: 0a2f49823402 - main - tty: fix a panic with INVARIANTS
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 22 Feb 2022 18:37:52 UTC
The branch main has been updated by rew:
URL: https://cgit.FreeBSD.org/src/commit/?id=0a2f498234023008d9a3b13ad7fc8fd81d384bab
commit 0a2f498234023008d9a3b13ad7fc8fd81d384bab
Author: Robert Wing <rew@FreeBSD.org>
AuthorDate: 2022-02-22 18:22:18 +0000
Commit: Robert Wing <rew@FreeBSD.org>
CommitDate: 2022-02-22 18:37:13 +0000
tty: fix a panic with INVARIANTS
watch'ing a tty triggers a refcount wraparound panic, take a reference
on fp after fget_cap_locked() to fix.
Reported by: Michael Jung <mikej_at_paymentallianceintl.com>
Reviewed by: hselasky, mjg
Fixes: f40dd6c8034b ("tty: switch ttyhook_register to use fget_cap_locked")
Differential Revision: https://reviews.freebsd.org/D34335
---
sys/kern/tty.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index ebb32f698e88..9e6cd8d317cc 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -2083,6 +2083,8 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd, struct ttyhook *th,
FILEDESC_SLOCK(fdp);
error = fget_cap_locked(fdp, fd, cap_rights_init_one(&rights, CAP_TTYHOOK),
&fp, NULL);
+ if (error == 0 && !fhold(fp))
+ error = EBADF;
FILEDESC_SUNLOCK(fdp);
if (error != 0)
return (error);