• Jiri Slaby's avatar
    TTY: ldisc, wait for idle ldisc in release · 31e12128
    Jiri Slaby authored
    We reintroduced tty_ldisc_wait_idle in 100eeae2 (TTY: restore
    tty_ldisc_wait_idle) and used in set_ldisc. Then we added it also to
    the hangup path in 92f6fa09 (TTY: ldisc, do not close until there
    are readers). And we noted that there is one more path:
    ~   Before 65b77046 tty_ldisc_wait_idle was called also from
    ~   tty_ldisc_release. It is called from tty_release, so I don't think
    ~   we need to restore that one.
    
    Well, I was wrong. There might still be holders of an ldisc
    reference. Not from userspace, but drivers. If they take a reference
    and a user closes the device immediately after that, we have a
    problem. ldisc is halted and closed by TTY, but the driver still may
    call some ldisc's operation and cause a crash.
    
    So restore the tty_ldisc_wait_idle call also to the third location
    where it was before 65b77046 (tty-ldisc: turn ldisc user count
    into a proper refcount). Now we should be safe with respect to the
    ldisc reference counting as all* tty_ldisc_close paths are safely
    called with reference count of one.
    
    * Not the one in tty_ldisc_setup's fail path. But that is called
      before the first open finishes. So userspace does not see it yet.
      Even thought the driver is given the TTY already via ->install, it
      should not take a reference to the ldisc yet. If some driver is to
      do this, we should put one tty_ldisc_wait_idle also in the setup.
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    Acked-by: default avatarAlan Cox <alan@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    31e12128
tty_ldisc.c 23.8 KB