From cbbb63ae66efc52be5ee43d36205b68f1255b0b7 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Wed, 27 May 2015 00:06:40 +0100 Subject: [PATCH] tty; fix a race --- Kernel/tty.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Kernel/tty.c b/Kernel/tty.c index 37e2c661..7bcbdd0e 100644 --- a/Kernel/tty.c +++ b/Kernel/tty.c @@ -175,12 +175,16 @@ int tty_open(uint8_t minor, uint16_t flag) void tty_post(inoptr ino, uint8_t minor, uint8_t flag) { struct tty *t = &ttydata[minor]; + irqflags_t irq = di(); /* If there is no controlling tty for the process, establish it */ - if (!udata.u_ptab->p_tty && !t->pgrp && !(flag & O_NOCTTY)) { + /* Disable interrupts so we don't endup setting up our control after + the carrier drops and tries to undo it.. */ + if (!(t->flag & TTYF_DEAD) && !udata.u_ptab->p_tty && !t->pgrp && !(flag & O_NOCTTY)) { udata.u_ptab->p_tty = minor; udata.u_ctty = ino; t->pgrp = udata.u_ptab->p_pgrp; } + irqrestore(irq); } int tty_close(uint8_t minor) -- 2.34.1