• Peter Hurley's avatar
    pty: Fix packet mode setting race · 2622d73e
    Peter Hurley authored
    Because pty_set_pktmode() does not claim the slave's ctrl_lock
    to clear ->ctrl_status (to avoid unnecessary lock nesting),
    pty_set_pktmode() may accidentally erase new ->ctrl_status updates.
    For example,
    
    CPU 0                             | CPU 1
    pty_set_pktmode()                 | pty_start()
      spin_lock(master's ctrl_lock)   |
      tty->packet = 1                 |
                                      |   if (tty->link->packet)
                                      |     spin_lock(slave's ctrl_lock)
                                      |     tty->ctrl_status = TIOCPKT_START
      tty->link->ctrl_status = 0      |
    
    Ensure the clear of ->ctrl_status occurs before packet mode is set
    (and observable on another cpu).
    Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Reviewed-by: default avatarAlan Cox <alan@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2622d73e
pty.c 21.8 KB