tty; fix a race
authorAlan Cox <alan@linux.intel.com>
Tue, 26 May 2015 23:06:40 +0000 (00:06 +0100)
committerAlan Cox <alan@linux.intel.com>
Tue, 26 May 2015 23:06:40 +0000 (00:06 +0100)
Kernel/tty.c

index 37e2c66..7bcbdd0 100644 (file)
@@ -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)