summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2016-01-22 20:38:46 +0000
committerkib <kib@FreeBSD.org>2016-01-22 20:38:46 +0000
commit66dd616ca8c4d3779be38f549e7e793674dbfd03 (patch)
treefade96de2f635a4e584a9edcef3b0e599f5a3764 /sys/kern
parentf86fec2e86a50bc17e6d9b3216cfbf1a0acbb338 (diff)
downloadFreeBSD-src-66dd616ca8c4d3779be38f549e7e793674dbfd03.zip
FreeBSD-src-66dd616ca8c4d3779be38f549e7e793674dbfd03.tar.gz
In tty_dealloc(), clear the queues. See the comment for a scenario
which explains why ttydev_leave() cleanup might not happen. Submitted by: bde MFC after: 3 weeks
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/tty.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 1dc6af2..e28b303 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -213,7 +213,7 @@ ttydev_leave(struct tty *tp)
ttydisc_close(tp);
- /* Destroy associated buffers already. */
+ /* Free i/o queues now since they might be large. */
ttyinq_free(&tp->t_inq);
tp->t_inlow = 0;
ttyoutq_free(&tp->t_outq);
@@ -1031,10 +1031,15 @@ tty_dealloc(void *arg)
{
struct tty *tp = arg;
- /* Make sure we haven't leaked buffers. */
- MPASS(ttyinq_getsize(&tp->t_inq) == 0);
- MPASS(ttyoutq_getsize(&tp->t_outq) == 0);
-
+ /*
+ * ttyydev_leave() usually frees the i/o queues earlier, but it is
+ * not always called between queue allocation and here. The queues
+ * may be allocated by ioctls on a pty control device without the
+ * corresponding pty slave device ever being open, or after it is
+ * closed.
+ */
+ ttyinq_free(&tp->t_inq);
+ ttyoutq_free(&tp->t_outq);
seldrain(&tp->t_inpoll);
seldrain(&tp->t_outpoll);
knlist_destroy(&tp->t_inpoll.si_note);
OpenPOWER on IntegriCloud